1. Kubernetes介绍
1.1 Kubernetes简介
首先,他是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。 Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。以下简称k8s
1.2 Kubernetes优势
-
容器编排
-
轻量级
-
开源
-
弹性伸缩
-
负载均衡
1.3 Kubernetes组件说明
下面的描述中,不懂的名词可以参阅: https://www.kubernetes.org.cn/kubernetes-services
1.3.1 Borg架构分析
k8s框架整体是非常庞大的,我们先了解一下k8s组件构成。k8s的前身为谷歌的Borg,k8s为Borg用go语言的重构版,k8s作为Borglet的精良版,我们先了解一下Borglet的架构。下图为Borg的架构图
上图主要有两部分组成BorgMaster和Borglet。BorgMaster主要负责接受请求进行请求的分发,为防止BorgMaster单节点故障,BorgMaster有很多副本。 的Borglet负责容器的运行及计算。同样Borglet也为多副本。
Borg支持多种请求方式,当请求进入BorgMaster以后,scheduler对请求进行分析,之后将数据写入BorgMaster的Paxos数据库中,Borglet监听Paxos,当有与之相关的数据时对数据进行处理。
1.3.2 Kubernetes 架构分析
分析完Borg之后,下图将介绍k8s的架构图
k8s做为Borglet的精良版,上图可以分为上半部分master节点,及下半部分node节点。从图中可以看出,当请求或者kubectl过来时,api server 拿到数据时,依然由scheduler调度器对数据进行分析,之后返回api server 将数据存储到
Etcd
,其中的replication controller 用来维护容器的期望值。如果副本的数量不满足期望值时,replication controller将副本数量申请到期望值。node节点中kubelet会跟CRI(container runtime interface)进行交互。操作Docker创建容器。进行维持Pod的生命周期。 kube proxy完成负载均衡及Pod管理。 kube proxy默认操作对象是firewall(防火墙),实现Pod的映射。新版本还支持IPVS。
Etcd:官方将Etcd定位成一个可信赖的分布式键值存储服务,它能为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。k8s集群中使用Etcd v3 ,v2版本已经在k8s v1.11中弃用。v2会将所有数据全部写入内存中。v3会将部分数据写入到本地的数据卷中。v3版不会造成数据损坏。会从本地磁盘进行恢复。k8s v1.11之前版本则要对Etcd进行数据备份操作。
综上分析,各个组件的作用为:
api server
: 所有服务访问统一入口
replication controller
:维持副本期望数目
scheduler
:负责任务处理,及分配合适的处置节点进行处置
Etcd
:键值对数据库。存储k8s集群重要信息
kubelet
:直接跟容器引擎进行交互实现容器生命周期管理
kube proxy
: 负责写入规则至 IPTABLES, IPVS 实现服务访问映射。
其他插件:
CoreDNS
: 可以为集群中的SVC创建一个域名IP的对应关系解析
Dashboard
: 为k8s集群提供一个B/S结构访问体系
Ingress Controller
: 官方只能实现四层代理,Ingress 可以实现七层代理
Fedetation
: 提供一个可以跨集群中心多K8S统一管理功能
Prometheus
: 提供k8s集群的监控能力ELK: 提供k8s日志统一分析介入平台
2. Kubernetes 基础概念
2.1 Pod概念
- 什么是Pod
• 一组容器的一个“单一集合体”
• K8s中的最小任务调度单元 • 可以被调度到任意Node上恢复
• 一个Pod里的所有容器共享资源 (网络、Volumes)
- Pod分类
自主式Pod:非控制器管理的Pod,这种Pod发生意外不会被重新启用
控制器管理的Pod:控制器管理的Pod在生命周期范围内会被重新构建起来
-
Pod 控制器类型
-
ReplicationController
用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建Pod来替代;而由于异常多出来的容器也会自动回收。
在新版本k8s中建议使用
Replicaset
来取代ReplicationController
。 -
ReplicaSet
ReplicaSet
和ReplicationController
没有本质的区别,ReplicaSet
支持集合式selector虽然
ReplicaSet
可以独立使用,但是一般还是建议使用Deployment
来自动管理ReplicaSet
,这样就无需担心与其他机制的不兼容内容(eg:ReplicaRet
不支持rolling-update但Deployment
支持) -
Deployment
Deployment
不直接操作Pod。Deployment
在创建时会创建ReplicaSet
,ReplicaSet
负责创建Pod.当Pod需要改变时,Deployment
会滚动新建ReplicaSet
,来更新Pod。 -
StatefulSet
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括
-
稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
-
稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
-
有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
-
有序收缩,有序删除(即从N-1到0)
-
-
DaemonSet
DaemonSet
确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为其新增一个Pod。当有Node从集群中移除时,这些Pod也会被回收。删除DaemonSet
将会删除它创建的所有Pod。使用
DaemonSet
的一些典型用法:-
运行集群存储daemon,例如在每个Node上运行glusterd,ceph。
-
在每个Node上运行日志收集daemon,例如fluented,logstash。
-
在每个Node上运行监控daemon,例如 Prometheus Node Exproter。
-
-
Job
,Cron Job
Job
: 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。Corn Job
: 管理基于时间的Job,即:-
在给定的时间点只运行一次
-
周期性地在给定时间点运行
-
2.2 网络通讯方式
k8s的网络模型假定了多有的Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,k8s假定这个网络模型已经存在。而在私有云里搭建k8s集群,就不能假定这个网络已经存在。我们需要实现这个假定网络,将不同节点的Docker容器之间的互通访问打通,然后运行k8s。
-
同一个Pod内的多个容器之间:IO
-
各Pod之间的通讯:Overlay Network
-
Pod与Service之间的通讯:各节点的Iptables规则,新版中使用了lVS机制进行转发。
2.2.1 Overlay Network的实现
为解决不同节点之间容器中通过ip进行通信,Flannel提供了解决方案
Flannel
是CoreOs团队针对k8s设计的一个网络规划服务,简单来说。它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动的传递到目标容器内。
Flannel的解决方式
如上图所示,在Node中我们会安装一个flanneld的守护进程,flanneld开启以后,会开启Flannel0的一个网桥,Flannel0收集Docker0的数据报文,Docker0分配自己的ip到Pod上面。如果为同一台主机的不同Pod,连通方式为Docker0的网桥请求转发。当为不同主机时,跨主机访问时,数据从源头发出,flanneld会从etcd中找出目标主机信息,然后将数据信息进行封装发送到目标主机,目标主机的flanneld拿到数据对数据进行解析以后,通过不同的目标信息将数据分发到对应ip。
综上所述k8s网络访问方式总结:
-
同一个Pod内部通讯:同一个Pod共享同一个网络命名空间,其享同一个 Linux协议栈
-
Podl至Pod2
Podl与Pod2不在同一台主机,Pod的地址是与 Docker0在同一个网段的,但 Docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问
Podl与Pod2在同一台机器,由 Docker0网桥直接转发请求至Pod2,不需要经过 Flannel演示
-
Pod至 Service的网络:目前基于性能考虑,全部为 LVS维护和转发(旧版为iptables)
-
Pod到外网:Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后, iptables执行 Masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求
-
外网访问Pod: Service
3. 实操篇之K8S安装及配置
3.1 系统的安装及初始化
安装配置虚拟机时的过程略过,每台虚拟机配置两种网络模式NAT和仅主机模式
-
安装之前的初始化
$ yum install git wget zsh vim
2.使用oh my zsh
关键字在浏览器中搜索,从GitHub
中找到以下指令进行修改
$ sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
3.安装完成之后对皮肤进行修改
$ vim .zshrc
# 修改其中的属性
ZSH_THEHE="bira"
$ source .zshrc
3.2 k8s集群环境安装步骤
3.2.2 基本环境配置
-
关闭selinux
$ setenforce 0 $ vim /etc/selinux/config # 将SELINUX的值改为disabled SELINUX=disabled
-
关闭swap分区或禁用swap文件
#注释掉交换部分的代码 /dev/mapper/centos_k8s--mast...
$vim /etc/fstab
# # /dev/mapper/centos_k8s--master-swap swap swap defaults 0 0
# 临时关闭
$ swapoff -a
3 . 修改网卡配置
$ vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
$ sysctl -p
4. 启用内核模块
#编辑此文件,可能不存在新建即可
$ vim /etc/sysconfig/modules/ipvs.modules
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 启用配置
$ modprobe -- ip_vs
$ modprobe -- ip_vs_rr
$ modprobe -- ip_vs_wrr
$ modprobe -- ip_vs_sh
$ modprobe -- nf_conntrack_ipv4
#验证是否生效
$ cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
5. 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
3.3 kubectl、kubeadm、kubelet的安装
3.3.1 添加Kubernetes的yum源
此处使用alibaba的镜像源
# 编辑安装源
$vim /etc/yum.repos.d/kubernetes.repo
# 文件内容
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
3.3.2 安装kubelet、kubeadm、kubectl
$ yum install -y kubelet kubeadm kubectl
3.3.3 启动kubelet服务
$ systemctl enable kubelet
$ systemctl start kubelet
此时执行systemctl status kubelet
查看服务状态,服务状态应为Error(255), 如果是其他错误可使用journalctl -xe
查看错误信息。
4. Docker安装和配置
4.1 Docker安装
docker的安装请查看官网文档: https://docs.docker.com/install/overview/
安装详情请参考官网
4.1.1 Docker配置
-
配置cgroup-driver为systemd
# 查看cgroup-driver $ docker info | grep -i cgroup Cgroup Driver: cgroupfs
由于k8s支持的默认驱动非cgroupfs,所以我们需要修改为默认驱动与k8s一致
第一种方式
# 追加 --exec-opt native.cgroupdriver=systemd 参数 $ /usr/lib/systemd/system/docker.service # 在第14行代码 后面追加 # 14 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd $ systemctl daemon-reload # 重新加载服务 $ systemctl enable docker # 启用docker服务(开机自起) $ systemctl restart docker # 启动docker服务
第二种方式
# 或者修改docker配置文件 $ vim /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } # 重新启动docker $ systemctl restart docker
-
预先拉取所需镜像
# 查看kubeadm所需镜像 $ kubeadm config images list k8s.gcr.io/kube-apiserver:v1.17.0 k8s.gcr.io/kube-controller-manager:v1.17.0 k8s.gcr.io/kube-scheduler:v1.17.0 k8s.gcr.io/kube-proxy:v1.17.0 k8s.gcr.io/pause:3.1 k8s.gcr.io/etcd:3.4.3-0 k8s.gcr.io/coredns:1.6.5 # 拉取镜像 $ docker pull kubeimage/kube-apiserver-amd64:v1.17.0 $ docker pull kubeimage/kube-controller-manager-amd64:v1.17.0 $ docker pull kubeimage/kube-scheduler-amd64:v1.17.0 $ docker pull kubeimage/kube-proxy-amd64:v1.17.0 $ docker pull kubeimage/pause-amd64:3.1 $ docker pull kubeimage/etcd-amd64:3.4.2-0 $ docker pull coredns/coredns:1.6.6
-
对预先拉取的镜像重新打tag
$ docker tag kubeimage/kube-apiserver-amd64:v1.17.0 k8s.gcr.io/kube-apiserver:v1.17.0 $ ddocker tag kubeimage/kube-controller-manager-amd64:v1.17.0 k8s.gcr.io/kube-controller-manager:v1.17.0 $ docker tag kubeimage/kube-scheduler-amd64:v1.17.0 k8s.gcr.io/kube-scheduler:v1.17.0 $ docker tag kubeimage/kube-proxy-amd64:v1.17.0 k8s.gcr.io/kube-proxy:v1.17.0 $ docker tag kubeimage/pause-amd64:3.1 k8s.gcr.io/pause:3.1 $ docker tag kubeimage/etcd-amd64:3.4.2-0 k8s.gcr.io/etcd:3.4.2-0 $ docker tag coredns/coredns:1.6.6 k8s.gcr.io/coredns:1.6.6
4.删除未改名之前的镜像
$ docker rmi kubeimage/kube-apiserver-amd64:v1.17.0 $ docker rmi kubeimage/kube-controller-manager-amd64:v1.17.0 $ docker rmi kubeimage/kube-scheduler-amd64:v1.17.0 $ docker rmi kubeimage/kube-proxy-amd64:v1.17.0 $ docker rmi kubeimage/pause-amd64:3.1 $ docker rmi kubeimage/etcd-amd64:3.4.2-0 $ docker rmi coredns/coredns:1.6.6
5. 对host进行配置
$ vim etc/hosts
192.168.64.10 k8s-master
192.168.64.20 k8s-node1
192.168.64.21 k8s-node2
至此为止我们只要复制master服务即可完成安装node1跟node2,修改ip配置及名称配置即可。
以上步骤需要在node节点和master节点执行,当前步骤仅需在master节点执行。
4.2 Master节点的初始化
# 初始化master节点,
# --pod-network-cidr=192.168.0.0/16 指定使用Calico网络
# --pod-network-cidr=192.244.0.0/16 指定使用flannel网络
#上述网络可以二选一, flannel较为简单,文档内使用了flannel
# --apiserver-advertise-address=10.0.0.5 指向master节点IP,此处也可以使用hosts
$ kubeadm init --pod-network-cidr=10.244.0.0/16 \
--kubernetes-version=v1.16.3 \
--apiserver-advertise-address=10.0.0.5
执行上述命令的输出为:
W0108 00:38:54.336940 48475 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0108 00:38:54.337025 48475 validation.go:28] Cannot validate kubelet config - no validator is available
[init] Using Kubernetes version: v1.17.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8s-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.64.10]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8s-master localhost] and IPs [192.168.64.10 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s-master localhost] and IPs [192.168.64.10 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
W0108 00:39:31.388440 48475 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[control-plane] Creating static Pod manifest for "kube-scheduler"
W0108 00:39:31.389992 48475 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
^[[D[apiclient] All control plane components are healthy after 137.596225 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.17" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node k8s-master as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node k8s-master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: wq1d08.oax1679f016eo5ns
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.64.10:6443 --token wq1d08.oax1679f016eo5ns \
--discovery-token-ca-cert-hash sha256:69c47e2f1aee50b62db3487b59931308b6693185c8a45099099808a80c15ce03
上面代码中提示我们需要
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看node节点
kubectl get nodes -o wide
此处使用kubeadm token create --print-join-command
指令
$ kubeadm token create --print-join-command
kubeadm join k8s-master:6443 --token vtf7im.fq4c3ktuaz7je0dp --discovery-token-ca-cert-hash sha256:69c47e2f1aee50b62db3487b59931308b6693185c8a45099099808a80c15ce03
$ kubeadm join k8s-master:6443 --token vtf7im.fq4c3ktuaz7je0dp --discovery-token-ca-cert-hash sha256:69c47e2f1aee50b62db3487b59931308b6693185c8a45099099808a80c15ce03
我们将上述获得的结果输入各个node节点,如果在配置好网络以后执行
watch kubectl get pods --all-namespaces -o wide
我们就会看见网络插件pod在其中生成
4.3 flannel网络插件的配置
Calico的官方文档地址为: https://github.com/coreos/flannel 。 具体安装步骤:
-
安装flannel
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
-
监听安装进度
$ watch kubectl get pods --all-namespaces
出现以下内容时为安装成功
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6955765f44-bk8q8 1/1 Running 0 31m
kube-system coredns-6955765f44-t6j8b 1/1 Running 0 31m
kube-system etcd-k8s-master 1/1 Running 0 31m
kube-system kube-apiserver-k8s-master 1/1 Running 0 31m
kube-system kube-controller-manager-k8s-master 1/1 Running 1 31m
kube-system kube-flannel-ds-amd64-74bvt 1/1 Running 0 56s
kube-system kube-proxy-q26xp 1/1 Running 0 31m
kube-system kube-scheduler-k8s-master 1/1 Running 1 31m
-
测试
$ kubectl get nodes -o wideNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIMEkubernetes-master Ready master 4d12h v1.16.3 192.168.56.101 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.4
4.4 Node节点的初始化
-
登录node节点,执行加入集群的命令,完成加入集群操作
$ kubeadm join 10.0.0.5:6443 --token kt58np.djd3youoqb0bnz4r \ --discovery-token-ca-cert-hash sha256:37a3924142dc6d57eac2714e539c174ee3b0cda723746ada2464ac9e8a2091ce
-
在master节点上查看添加结果
$ kubectl get nodes -o wide
-
加入成功以后
$ watch kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-6955765f44-bk8q8 1/1 Running 0 62m 10.244.0.2 k8s-master <none> <none>
kube-system coredns-6955765f44-t6j8b 1/1 Running 0 62m 10.244.0.3 k8s-master <none> <none>
kube-system etcd-k8s-master 1/1 Running 0 62m 192.168.64.10 k8s-master <none> <none>
kube-system kube-apiserver-k8s-master 1/1 Running 0 63m 192.168.64.10 k8s-master <none> <none>
kube-system kube-controller-manager-k8s-master 1/1 Running 4 62m 192.168.64.10 k8s-master <none> <none>
kube-system kube-flannel-ds-amd64-74bvt 1/1 Running 0 32m 192.168.64.10 k8s-master <none> <none>
kube-system kube-flannel-ds-amd64-jxf48 1/1 Running 0 3m15s 192.168.64.21 k8s-node2 <none> <none>
kube-system kube-flannel-ds-amd64-wwxdd 1/1 Running 0 3m13s 192.168.64.20 k8s-node1 <none> <none>
kube-system kube-proxy-llr6k 1/1 Running 0 3m15s 192.168.64.21 k8s-node2 <none> <none>
kube-system kube-proxy-q26xp 1/1 Running 0 62m 192.168.64.10 k8s-master <none> <none>
kube-system kube-proxy-tzlm5 1/1 Running 0 3m13s 192.168.64.20 k8s-node1 <none> <none>
kube-system kube-scheduler-k8s-master 1/1 Running 4 63m 192.168.64.10 k8s-master <none> <none>
当出现一下结果时说明部署已经成功了