`
m635674608
  • 浏览: 5054808 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

以Kubeadm方式安装的Kubernetes集群的探索

 
阅读更多

当前手上有两个Kubernetes cluster,一个是采用kube-up.sh安装的k8s 1.3.7版本,另外一个则是采用kubeadm安装的k8s 1.5.1版本。由于1.3.7版本安装在前,并且目前它也是承载了我们PaaS平台的环境,因此对于这个版本的Kubernetes安装环境、配置操作、日志查看、集群操作等相对较为熟悉。而Kubeadm安装的1.5.1版本K8s集群在组件部署、配置、日志等诸多方面与1.3.7版本有了较大差异。刚上手的时候,你会发现你原来所熟知的1.3.7的东西都不在原先的位置上了。估计很多和我一样,采用kubeadm将集群升级到1.5.1版本的朋友们都会遇到这类问题,于是这里打算对Kubeadm方式安装的Kubernetes集群进行一些小小的探索,把一些变动较大的点列出来,供大家参考。

一、环境

这里使用的依然是文章《使用Kubeadm安装Kubernetes》中安装完毕的Kubernetes 1.5.1集群环境,底层是阿里云ECS,操作系统是Ubuntu 16.04.1。网络用的是weave network

试验集群只有两个Node:一个master node和一个minion node。但Master node由于被taint了,因此它与minion node一样参与集群调度和承担负载。

二、核心组件的Pod化

Kubeadm安装的k8s集群与kube-up.sh安装集群相比,最大的不同应该算是kubernetes核心组件的Pod化,即:kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、kube-discovery以及etcd等核心组件都运行在集群中的Pod里的,这颇有些CoreOS的风格。只有一个组件是例外的,那就是负责在node上与本地容器引擎交互的Kubelet。

K8s的核心组件Pod均放在kube-system namespace中,通过kubectl(on master node)可以查看到:

# kubectl get pods -n kube-system
NAME                                    READY     STATUS    RESTARTS   AGE
etcd-iz25beglnhtz                       1/1       Running   2          26d
kube-apiserver-iz25beglnhtz             1/1       Running   3          26d
kube-controller-manager-iz25beglnhtz    1/1       Running   2          26d
kube-scheduler-iz25beglnhtz             1/1       Running   4          26d
... ...

另外细心的朋友可能会发现,这些核心组建的Pod名字均以所在Node的主机名为结尾,比如:kube-apiserver-iz25beglnhtz中的”iz25beglnhtz”就是其所在Node的主机名。

不过,即便这些核心组件是一个容器的形式运行在集群中,组件所使用网络依然是所在Node的主机网络,而不是Pod Network

# docker ps|grep apiserver
98ea64bbf6c8        gcr.io/google_containers/kube-apiserver-amd64:v1.5.1            "kube-apiserver --ins"   10 days ago         Up 10 days                              k8s_kube-apiserver.6c2e367b_kube-apiserver-iz25beglnhtz_kube-system_033de1afc0844729cff5e100eb700a81_557d1fb2
4f87d22b8334        gcr.io/google_containers/pause-amd64:3.0                        "/pause"                 10 days ago         Up 10 days                              k8s_POD.d8dbe16c_kube-apiserver-iz25beglnhtz_kube-system_033de1afc0844729cff5e100eb700a81_5931e490

# docker inspect 98ea64bbf6c8
... ...
"HostConfig": {
"NetworkMode": "container:4f87d22b833425082be55851d72268023d41b50649e46c738430d9dfd3abea11",
}
... ...

# docker inspect 4f87d22b833425082be55851d72268023d41b50649e46c738430d9dfd3abea11
... ...
"HostConfig": {
"NetworkMode": "host",
}
... ...

从上面docker inspect的输出可以看出kube-apiserver pod里面的pause容器采用的网络模式是host网络,而以pause容器网络为基础的kube-apiserver 容器显然就继承了这一network namespace。因此从外面看,访问Kube-apiserver这样的组件和以前没什么两样:在Master node上可以通过localhost:8080访问;在Node外,可以通过master_node_ip:6443端口访问。

三、核心组件启动配置调整

在kube-apiserver等核心组件还是以本地程序运行在物理机上的时代,修改kube-apiserver的启动参数,比如修改一下–service-node-port-range的范围、添加一个–basic-auth-file等,我们都可以通过直接修改/etc/default/kube-apiserver(以Ubuntu 14.04为例)文件的内容并重启kube-apiserver service(service restart kube-apiserver)的方式实现。其他核心组件:诸如:kube-controller-manager、kube-proxy和kube-scheduler均是如此。

但在kubeadm时代,这些配置文件不再存在,取而代之的是和用户Pod描述文件类似的manifest文件(都放置在/etc/kubernetes/manifests下面):

/etc/kubernetes/manifests# ls
etcd.json  kube-apiserver.json  kube-controller-manager.json  kube-scheduler.json

我们以为kube-apiserver增加一个启动参数:”–service-node-port-range=80-32767″ 为例:

打开并编辑/etc/kubernetes/manifests/kube-apiserver.json,在“command字段对应的值中添加”–service-node-port-range=80-32767″:

"containers": [
      {
        "name": "kube-apiserver",
        "image": "gcr.io/google_containers/kube-apiserver-amd64:v1.5.1",
        "command": [
          "kube-apiserver",
          "--insecure-bind-address=127.0.0.1",
          "--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota",
          "--service-cluster-ip-range=10.96.0.0/12",
          "--service-account-key-file=/etc/kubernetes/pki/apiserver-key.pem",
          "--client-ca-file=/etc/kubernetes/pki/ca.pem",
          "--tls-cert-file=/etc/kubernetes/pki/apiserver.pem",
          "--tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem",
          "--token-auth-file=/etc/kubernetes/pki/tokens.csv",
          "--secure-port=6443",
          "--allow-privileged",
          "--advertise-address=10.47.217.91",
          "--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname",
          "--anonymous-auth=false",
          "--etcd-servers=http://127.0.0.1:2379",
          "--service-node-port-range=80-32767"
        ],

注意:不要忘记在–etcd-servers这一行后面添加一个逗号,否则kube-apiserver会退出。

修改后,你会发现kube-apiserver会被自动重启。这是kubelet的功劳。kubelet在启动时监听/etc/kubernetes/manifests目录下的文件变化并做适当处理:

# ps -ef|grep kubelet
root      1633     1  5  2016 ?        1-09:24:47 /usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=10.96.0.10 --cluster-domain=cluster.local

kubelet自身是一个systemd的service,它的启动配置可以通过下面文件修改:

# cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_EXTRA_ARGS

四、kubectl的配置

kube-up.sh安装的k8s集群会在每个Node上的~/.kube/下创建config文件,用于kubectl访问apiserver和操作集群使用。但在kubeadm模式下,~/.kube/下面的内容变成了:

~/.kube# ls
cache/  schema/

于是有了问题1:config哪里去了?

之所以在master node上我们的kubectl依旧可以工作,那是因为默认kubectl会访问localhost:8080来与kube-apiserver交互。如果kube-apiserver没有关闭–insecure-port,那么kubectl便可以正常与kube-apiserver交互,因为–insecure-port是没有任何校验机制的。

于是又了问题2:如果是其他node上的kubectl与kube-apiserver通信或者master node上的kubectl通过secure port与kube-apiserver通信,应该如何配置?

接下来,我们一并来回答上面两个问题。kubeadm在创建集群时,在master node的/etc/kubernetes下面创建了两个文件:

/etc/kubernetes# ls -l
total 32
-rw------- 1 root root 9188 Dec 28 17:32 admin.conf
-rw------- 1 root root 9188 Dec 28 17:32 kubelet.conf
... ...

这两个文件的内容是完全一样的,仅从文件名可以看出是谁在使用。比如kubelet.conf这个文件,我们就在kubelet程序的启动参数中看到过:–kubeconfig=/etc/kubernetes/kubelet.conf

# ps -ef|grep kubelet
root      1633     1  5  2016 ?        1-09:26:41 /usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=10.96.0.10 --cluster-domain=cluster.local

打开这个文件,你会发现这就是一个kubeconfig文件,文件内容较长,我们通过kubectl config view来查看一下这个文件的结构:

# kubectl --kubeconfig /etc/kubernetes/kubelet.conf config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://{master node local ip}:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: admin
  name: admin@kubernetes
- context:
    cluster: kubernetes
    user: kubelet
  name: kubelet@kubernetes
current-context: admin@kubernetes
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
- name: kubelet
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

这和我们在《Kubernetes集群Dashboard插件安装》一文中介绍的kubeconfig文件内容并不二致。不同之处就是“REDACTED”这个字样的值,我们对应到kubelet.conf中,发现每个REDACTED字样对应的都是一段数据,这段数据是由对应的数字证书内容或密钥内容转换(base64)而来的,在访问apiserver时会用到。

我们在minion node上测试一下:

minion node:

# kubectl get pods
The connection to the server localhost:8080 was refused - did you specify the right host or port?

# kubectl --kubeconfig /etc/kubernetes/kubelet.conf get pods
NAME                         READY     STATUS    RESTARTS   AGE
my-nginx-1948696469-359d6    1/1       Running   2          26d
my-nginx-1948696469-3g0n7    1/1       Running   3          26d
my-nginx-1948696469-xkzsh    1/1       Running   2          26d
my-ubuntu-2560993602-5q7q5   1/1       Running   2          26d
my-ubuntu-2560993602-lrrh0   1/1       Running   2          26d

kubeadm创建k8s集群时,会在master node上创建一些用于组件间访问的证书、密钥和token文件,上面的kubeconfig中的“REDACTED”所代表的内容就是从这些文件转化而来的:

/etc/kubernetes/pki# ls
apiserver-key.pem  apiserver.pem  apiserver-pub.pem  ca-key.pem  ca.pem  ca-pub.pem  sa-key.pem  sa-pub.pem  tokens.csv
  • apiserver-key.pem:kube-apiserver的私钥文件
  • apiserver.pem:kube-apiserver的公钥证书
  • apiserver-pub.pem kube-apiserver的公钥文件
  • ca-key.pem:CA的私钥文件
  • ca.pem:CA的公钥证书
  • ca-pub.pem :CA的公钥文件
  • sa-key.pem :serviceaccount私钥文件
  • sa-pub.pem :serviceaccount的公钥文件
  • tokens.csv:kube-apiserver用于校验的token文件

在k8s各核心组件的启动参数中会看到上面文件的身影,比如:

 kube-apiserver --insecure-bind-address=127.0.0.1 --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota --service-cluster-ip-range=10.96.0.0/12 --service-account-key-file=/etc/kubernetes/pki/apiserver-key.pem --client-ca-file=/etc/kubernetes/pki/ca.pem --tls-cert-file=/etc/kubernetes/pki/apiserver.pem --tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem --token-auth-file=/etc/kubernetes/pki/tokens.csv --secure-port=6443 --allow-privileged --advertise-address={master node local ip} --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --anonymous-auth=false --etcd-servers=http://127.0.0.1:2379 --service-node-port-range=80-32767

我们还可以在minion node上通过curl还手工测试一下通过安全通道访问master node上的kube-apiserver。在《Kubernetes集群的安全配置》一文中,我们提到过k8s的authentication(包括:客户端证书认证、basic auth、static token等)只要通过其中一个即可。当前kube-apiserver开启了客户端证书认证(–client-ca-file)和static token验证(–token-auth-file),我们只要通过其中一个,就可以通过authentication,于是我们使用static token方式。static token file的内容格式:

token,user,uid,"group1,group2,group3"

对应到master node上的tokens.csv

# cat /etc/kubernetes/pki/tokens.csv
{token},{user},812ffe41-cce0-11e6-9bd3-00163e1001d7,system:kubelet-bootstrap

我们用这个token通过curl与apiserver交互:

# curl --cacert /etc/kubernetes/pki/ca.pem -H "Authorization: Bearer {token}"  https://{master node local ip}:6443
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/apps",
    "/apis/apps/v1beta1",
    "/apis/authentication.k8s.io",
    "/apis/authentication.k8s.io/v1beta1",
    "/apis/authorization.k8s.io",
    "/apis/authorization.k8s.io/v1beta1",
    "/apis/autoscaling",
    "/apis/autoscaling/v1",
    "/apis/batch",
    "/apis/batch/v1",
    "/apis/batch/v2alpha1",
    "/apis/certificates.k8s.io",
    "/apis/certificates.k8s.io/v1alpha1",
    "/apis/extensions",
    "/apis/extensions/v1beta1",
    "/apis/policy",
    "/apis/policy/v1beta1",
    "/apis/rbac.authorization.k8s.io",
    "/apis/rbac.authorization.k8s.io/v1alpha1",
    "/apis/storage.k8s.io",
    "/apis/storage.k8s.io/v1beta1",
    "/healthz",
    "/healthz/poststarthook/bootstrap-controller",
    "/healthz/poststarthook/extensions/third-party-resources",
    "/healthz/poststarthook/rbac/bootstrap-roles",
    "/logs",
    "/metrics",
    "/swaggerapi/",
    "/ui/",
    "/version"
  ]
}

http://tonybai.com/2017/01/24/explore-kubernetes-cluster-installed-by-kubeadm/

分享到:
评论

相关推荐

    Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装.rar

    至此,你已经在Ubuntu 18.04上成功地安装和部署了一个Kubernetes集群,并且安装了Helm。你可以继续探索Helm的Chart仓库,部署更多复杂的应用,并利用Helm的强大功能进行版本控制和应用管理。 记住,Kubernetes和...

    kubeadm-dind-cluster:[EOL]一个基于kubeadm的Kubernetes多节点测试集群

    kubeadm-dind-cluster,即Docker-in-Docker (DIND) 集群,为开发者提供了一个便捷的方式来快速搭建基于kubeadm的Kubernetes集群,尤其适合进行测试和开发。然而,需要注意的是,这个项目已经达到了其生命周期的结束...

    kubeadm.zip

    在使用kubeadm搭建Kubernetes集群时,我们需要了解以下几个关键知识点: 1. **集群初始化**:kubeadm init是创建Kubernetes集群的第一步。这个命令会配置Master节点,安装核心组件如kube-apiserver、kube-...

    kubernetes-server-linux-amd64.tar

    在Linux环境中部署Kubernetes集群,通常会采用Kubernetes的部署工具kubeadm。首先,你需要在所有参与的服务器上安装必要的依赖包,如Docker和cri-tools。然后,通过kubeadm初始化主节点,创建证书和配置文件,设置...

    linux-在raspberrypi3B上安装KubernetesDocker

    3. 初始化Kubernetes集群: ``` sudo kubeadm init --pod-network-cidr=192.168.0.0/16 ``` 注意:这里设置的`--pod-network-cidr`应与你选择的网络插件兼容。 **五、配置kubectl** 集群初始化后,创建一个配置文件...

    适用于家庭实验室的3节点Kubernetes集群-快速而肮脏!

    通过这个3节点的家庭实验室Kubernetes集群,你可以探索Kubernetes的高级特性,比如Service发现、持久化存储、滚动更新、自我修复等。此外,这个环境也适合试验不同的容器化应用、学习Kubernetes API和YAML配置文件的...

    Python-Wise2CBreeze是一个图形化的Kubernetes部署工具

    通过提供直观的图形用户界面(GUI),Wise2CBreeze降低了用户对kubeadm等命令行工具的依赖,使得即使是不熟悉底层命令行操作的用户也能轻松部署和管理Kubernetes集群。 **Kubernetes基础** Kubernetes(简称K8s)...

    kubernetes_the_easy_way:使用Vagrant和脚本以困难的方式自动化Kubernetes

    总的来说,这个项目旨在通过手动和脚本化的方式来搭建Kubernetes集群,虽然这种方式可能比使用现成的工具(如kubeadm)更复杂,但它能让我们更好地理解Kubernetes的内部运作,并且有助于提高解决实际问题的能力。...

    centos k8s安装dapr

    至此,Dapr已在你的CentOS系统上的Kubernetes集群中成功安装。你可以在你的应用中引入Dapr,利用其强大的服务网格功能,如服务发现、服务间调用、状态管理、日志和指标等。 总结一下,这个过程涵盖了以下几个关键...

    K8tools-工具集

    - **诊断工具**:帮助识别和解决Kubernetes集群的问题,如`Kubeadm-diagnostics`。 - **资源管理工具**:用于查看、修改和管理Kubernetes资源,如Pod、Service、Deployment等。 - **性能分析工具**:如`kube-...

    Kubernetes(K8s)入门学习文档

    Kubernetes集群可以通过多种方式进行安装,如使用官方的`kubeadm`工具,或者使用第三方工具如Minikube(本地开发)、Kubespray(多节点生产环境)等。 **5. 应用部署** 通过编写YAML或JSON文件定义应用的配置,然后...

    vagrant-kubernetes-3-node-cluster-ubuntu-20.04:vagrant-kubernetes-3-node-cluster-ubuntu-20.04

    本篇将详细介绍如何使用Vagrant在Ubuntu 20.04上搭建一个包含三个节点的Kubernetes集群。 首先,我们要了解Vagrant的核心概念。Vagrant通过提供一种跨平台的接口来管理虚拟机,它与各种虚拟化技术(如VirtualBox、...

    安装k8s-linux

    通过上述步骤,我们可以在Linux环境下成功搭建一个Kubernetes集群,并实现基本的容器管理和调度功能。这不仅有助于理解Kubernetes的工作原理和技术细节,也为进一步探索高级特性打下了坚实的基础。

    K8S新版学习教程(k8s in action) 英文原版

    3. **Kubernetes集群**:介绍Kubernetes集群的组成,包括Master节点、Worker节点、Pods、Services等核心概念。 **第二部分:Kubernetes实战** 4. **部署应用**:详细说明如何使用Deployment创建和管理应用的实例,...

    terraform-kubernetes-kvm:通过Terraform设置VM的KVM上的Kubernetes Hard Way

    在本项目"terraform-kubernetes-kvm"中,我们探索如何使用Terraform在KVM(Kernel-based Virtual Machine)上手动搭建Kubernetes集群,这通常被称为“Kubernetes Hard Way”。这个过程旨在提供对Kubernetes组件及...

    kubernetes-the-hard-way-on-raspberry-pi

    在探索如何在Raspberry Pi上手动搭建Kubernetes集群时,我们面临了一次技术挑战之旅。Kubernetes(通常简称为K8s)是一个开源容器编排系统,用于自动化应用部署、扩展和管理。而Raspberry Pi则是一种小型且经济实惠...

    centos7环境下k8s 1.9 机docker 安装手册

    本手册针对 CentOS 7 版本下的 Kubernetes 1.9 和 Docker 的安装进行了详细的说明,并提供了从环境准备到集群搭建的完整步骤。 #### 二、系统环境配置 **目标**: 为确保 Kubernetes 能够在 CentOS 7 上顺利运行,...

    Kubernetes-Home-Lab

    在构建“Kubernetes-家庭实验室”时,您将探索如何在个人环境中设置和管理Kubernetes集群,这是一种强大的容器编排工具。Kubernetes(通常简称为K8s)允许您高效地部署、扩展和管理分布式应用。这个项目可能涉及到...

    Kubernetes数字证书体系浅析.docx

    在K8S集群中,证书的生成与管理通常通过以下几种方式进行: - **使用`kubeadm`工具**:对于初学者来说,这是一个非常便捷的方法,`kubeadm init`命令会自动创建所需的证书。 - **手动创建证书**:对于更高级的用户...

Global site tag (gtag.js) - Google Analytics