Ubuntu18.04使用kubeadm部署v1.18 HA集群

本章大纲

  1. 为什么用Ubuntu来搭建Kubernetes环境
  2. Kubernetes部署平台及方式
  3. Kubernetes集群组件运行模式
  4. Kubeadm命令介绍
  5. Kubeadm init工作流程
  6. Kubeadmin join工作流程
  7. 准备集群环境和部署Kubernetes的必要条件
  8. 安装Kubeadm Kubelet Kubectl
  9. 控制平面初始化(Master)
  10. 数据平面初始化(Node)
  11. 控制平面进行HA高可用
  12. 集群管理及集群状态信息获取命令
  13. 集群高可用测试
  14. Kubernetes集群常用命令
  15. 部署dashboard可视化插件

为什么用Ubuntu来搭建Kubernetes环境

因为RHEL系相对稳定保守的态度,导致其采用的kernel版本较低,而容器迭代速度较快。很多新特性是需要高版本kernel支持的,所以身边使用容器化的公司选用ubuntu 1804 LTS server的比较多,而LTS又是长期支持版,所以不要选错了。

Kubernetes部署平台及方式

常用的部署环境

  • laaS公有云环境:AWS、GGE、Azure等
  • laaS私有云或公有云环境:OpenStack和vSphere等
  • Baremetal环境:物理服务器或独立的虚拟机等

部署工具

  • kubeadm:唯一的kubernetes原声部署工具
  • Kops:Kops是AWS上才提供的部署方式
  • KIND
  • Typhoon
  • Bootkube
  • Minikube
  • Kubespray
  • KRIB
  • Kubicorn

Kubernetes集群组件运行模式

Kubernetes 集群支持三种运行模式:
1)独立组件模式:系统各个组件直接以守护进程的方式运行于节点之上,各组件之间相互协作构成集群。
2)静态 Pod 模式:除 kubelet 和 Docker 之外的其他组件 (如 etcd、kube-apiserver、kube-controller-mangeer和 kube-scheduler等)都是以静态 Pod 对象运行于 Master 主机之上,这些组件运行的Pod不受Kubernetes内部所管理。
3)自托管模式:这种模式是 Kubernetes的 自托管模式(self-hosted),它类似于第二种方式,将除了 kubelet 和 Docker 之外的其他组件运行为集群之上的 Pod 对象,但不同的是,这些 Pod 对象托管运行在 Kubernetes 集群自身之上受控于 DaemonSet 类型的控制器,而非静态的 Pod 对象。

使用 kubeadm 部署的 Kubernetes 集群可运行为第二种或者第三种模式,默认为静态 Pod 对象模式,需要使用自托管模式时,kubeadm init 命令使用 "--features-gates=selfHosting",选项即可,第一种模式集群的构建需要将各组件运行于系统之上的独立守护进程中,期间需要用到的证书及 Token 等认证信息也需要手动生成,过程繁琐且极易出错;若有必要用到,则建议使用 GitHub 上的项目辅助进行。

注意:无论是Pod模式还是独立组件模式,kubeletdocker目前都无法作为Pod运行,docker本身就是 Container Running,kubelet之所以无法做成Pod是因为依赖资源及权限太多,目前还没有做到以Pod方式运行。

Kubeadm命令

kubeadm 是 Kubernetes 项目自带的集群构建工具,它负责构建一个最小化的集群以及将其启动等必要的基本步骤,简单来讲,kubeadm 是 Kubernetes 集群全生命周期的管理工具,可用于实现集群的部署、升级/降级及拆除。在部署操作中,kubeadm 尽关心如何初始化并启动集群,余下的其他操作,例如安装 Kubernetes Dashboard、监控系统、日志系统等必要的附加组件则不再其考虑范围之内,需要自行部署。

Kubeadm的核心工具程序是kubeadm initkubeadm join,前者用于创建新的控制平面节点,后者则用于将节点快速连接到指定的控制平面,它们是创建Kubernetes集群最佳实践的“快速路径”。

kubeadm 共集成了以下工具程序:
kubeadm init: 工具用于集群初始化,其核心功能是部署 Master 节点的各个组件。
kubeadm join :工具用于将Node节点加入到指定集群中。
kubeadm token :可于集群构建后管理用于加入集群时使用的认证临牌 (token)。
kubeadm reset :命令的功能则是删除集群构建过程中生成的文件以重置回初始状态。

kubeadm 还支持管理初始引导认证令牌 (Bootstrap Token),完成待加入的新节点首次联系 API Server 时的身份认证(基于共享密钥)。另外,他们还支持管理集群版本的升降级操作。

Kubeadm init工作流程

kubeadm初始化控制平面的过程由许多步骤组成,启动过程如下图所示

阶段名称 主要作用
preflight 初始化前的环境检查
kubelet-start 生成kubelet配置并启动或重启kubelet以便于静态Pod运行各组件
certs 创建集群用到的各种数字证书,分别用于 ca,apiserver,front-proxy和etcd等
kubeconfig 为控制平面的各组件以及集群管理员分别生成 kubeconfig 文件
control-plane 为 apiserver、controller-manager 和 scheduler 分别生成静态 Pod 配置清单
etcd 为本地etcd 生成静态 Pod 配置清单
upload-config 将 kubeadm 和 kubelet 的配置存储为集群上的 configmap 资源对象
upload-certs 上传证书为 kubeadm-certs
mark-control-plane 将主机标记为控制平面,即 Master 节点

Kubeadmin join工作流程

kubeadm join用于将节点加入到某控制平面中

  1. 探测并确定可用的CRI套接字以确定容器运行时的环境
  2. 检查/etc/kubernetes/manifests目录下是否存在且是否为空
  3. 检查/etc/kubernetes目录下kubelet.conf和bootstarp-kubelet.conf文件是否存在
  4. 检查crictl是否存在且可执行
  5. 检查内核参数 net.bridge.bridge-nf-call-iptables 和 net.ipv4.ip_forward 的值是否满足需求
  6. 检查Swap设备是否处于启用状态
  7. 检查 ip、iptables、mount、nsenter、ebtables、ethtool、socat、tc和 touch 等可执行程序是否存在
  8. 验证 kubelet 的版本号以及服务是否处于启用(enable)和活动(active)状态
  9. 检查TCP端口10250的可用性
  10. 检查文件/etc/kubernetes/pki/ca.crt是否存在

集群环境

以下机器都为4C/8G配置

角色 IP地址 主机名 系统版本 内核版本 Docker版本 K8s版本
Master01 192.168.31.221 k8s-master01 Ubuntu 18.04.4 LTS 4.15.0-76-generic 18.06.0 v1.18.0
Master02 192.168.31.222 k8s-master02 Ubuntu 18.04.4 LTS 4.15.0-76-generic 18.06.0 v1.18.0
Master03 192.168.31.223 k8s-master03 Ubuntu 18.04.4 LTS 4.15.0-76-generic 18.06.0 v1.18.0
Node01 192.168.31.231 k8s-node01 Ubuntu 18.04.4 LTS 4.15.0-76-generic 18.06.0 v1.18.0
Node02 192.168.31.232 k8s-node02 Ubuntu 18.04.4 LTS 4.15.0-76-generic 18.06.0 v1.18.0
Node03 192.168.31.233 k8s-node03 Ubuntu 18.04.4 LTS 4.15.0-76-generic 18.06.0 v1.18.0

设置部署Kubernetes必要条件

所有机器操作
1.Ubuntu修改仓库镜像

sudo cat > /etc/apt/sources.list << EOF
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
EOF

2.关闭防火墙

sudo ufw disable

3.时间同步
ubuntu安装chrony后启动,默认连接互联网的服务器进行时间同步

sudo apt-get install chrony -y && sudo systemctl start chrony && sudo systemctl enable chrony

#查看chrony连接的公网服务器
cat /etc/chrony/chrony.conf 
pool ntp.ubuntu.com        iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2

4.禁用swap

sudo swapoff -a             #临时禁用
sudo vim /etc/fstab         #修改/etc/fstab下的swap,在前面加注释,下次机器重启就不会启用了
#/swap.img      none    swap    sw      0       0

5.关闭SELinux
默认ubuntu是没有安装SELinux,假如安装了的话,按如下步骤禁用selinux

sudo setenforce 0           #临时关闭
sudo vi /etc/selinux/config #永久关闭
SELINUX=permissive 

6.修改内核

sudo  cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1                     #开启ipv4转发,允许内置路由
EOF
sudo sysctl --system

7.修改时区

sudo ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sudo bash -c "echo 'Asia/Shanghai' > /etc/timezone"

8.安装Docker

#Step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

#Step 2: 安装GPG证书
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

#Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

#Step 4: 查找Docker-CE的版本
sudo apt-cache madison docker-ce

#Step 5: 安装指定版本的Docker-CE,docker-ce=[VERSION](如果安装最新版本则无需带版本号)
sudo apt-get -y install docker-ce=18.06.0~ce~3-0~ubuntu

#Setp 6: 安装完成后Docker默认就已经启动和加入开机自启了,这点我们不需要再做了,不过可以检查一下
sudo systemctl status docker
sudo systemctl is-enabled docker

#Setp 7:  配置Docker镜像加速以及指定cgroup驱动为systemd
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://81z69sad.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

#Setp 8:  配置完成后使用 docker info 可以看到修改的配置信息

9.配置主机名称解析

cat >> /etc/hosts << EOF
192.168.31.221  k8s-master01
192.168.31.222  k8s-master02
192.168.31.223  k8s-master03
192.168.31.231  k8s-node01
192.168.31.232  k8s-node02
192.168.31.233  k8s-node03
192.168.31.221  k8s-devops.io       #此解析作为控制平台的接入点(后面在集群初始化的时候会讲到)
EOF

安装Kubeadm Kubelet Kubectl

所有机器操作

#Step 1: 安装必要的程序包
apt-get update && apt-get install -y apt-transport-https

#Step 2: 导入Kubernetes官方包签名密钥
sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 

#Step 3: 添加Kubernetes仓库
cat > /etc/apt/sources.list.d/kubernetes.list << EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF 

#Step 4: 更新仓库 
apt-get update

#Step 5: 查找kubeadm kubelet kubectl版本
apt-cache madison kubeadm | grep 1.18
apt-cache madison kubelet | grep 1.18
apt-cache madison kubectl | grep 1.18
#目前1.18发布了1.18.0-00 1.18.1-00 1.18.2-00 三个版本

#Step 6: 指定版本安装kubelet kubeadm kubectl(如果安装最新版本则无需带版本号)
apt-get install kubeadm=1.18.0-00 kubelet=1.18.0-00 kubectl=1.18.0-00 -y

我们使用apt-get下载的程序包都在/var/cache/apt/archives目录下

控制平面初始化

控制平面为集群中的管理节点Master
Master和各Node的Docker及kubelet配置完成后,便可以在master节点上执行 “kubeadm init”命令进行集群初始化。
初始化过程中 Kubernetes会下载管理节点所用到的 6 个 docker镜像分别为 Kubernetes 的各个组件,以 静态 Pod 的方式运行于容器之中。
kubeadm init命令支持两种初始化方式:
1)通过命令行选项传递关键的参数设定
2)基于 yaml 格式的专用配置文件设定更详细的配置参数
这里演示通过第一种方法进行初始化。

以下将现初始化master01,初始化完成后将node节点加入集群,也就是集群中只有一个控制平面,然后再将其它两个master加入初始化并加入控制平面,用来做控制平面的HA

1.Master 初始化

root@k8s-master01:~# kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--control-plane-endpoint k8s-devops.io \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=0.0.0.0 \
--ignore-preflight-errors=Swap \
--token-ttl 30m

2.参数解释:

  • --image-repository:初始化过程中会去docker仓库拉去镜像,默认指定的为docker hub(国内访问网速不堪),所以在此使用–image-repository参数指定阿里云镜像。
  • --kubernetes-version:指定正在使用的 Kubernetes 程序组件的版本号,需要与 kubelet kubeadm kubectl 的版本号一致。
  • --control-plane-endpoint: 指定控制平面的固定访问端点,可以是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件API Server的访问地址;单控制平面部署时可以不使用该选项(如果是单个Master部署则不需要使用该选项,因为等会我们要再加入其它两个Master节点到控制平面,所以这里加上此参数)。
  • --pod-network-cidr:Pod 网络的地址范围,其值为 CIDR 格式的网络地址,使用 flannel 网络插件时,其默认地址为 10.244.0.0/16
  • --service-cidr:Service 的网络地址范围,其值为 CIDR 格式的网络地址,默认地址为 10.96.0.0/12
  • --apiserver-advertise-address:API Server 通告给其它组件的IP地址,一般为 Master 节点的IP地址,0.0.0.0 标识节点上所有可用的地址。
  • ignore-preflight-errors:忽略哪些运行时的错误信息,其值为 Swap 时,表示忽略因 swap 未关闭而导致的错误。
  • --token-ttl:token令牌自动删除时间,默认为24小时,指定为 0 表示永不过期,指定单位可以使 秒s 分m 时h,在node加入Kubernetes集群时需要指定token。

3.初始化过程图示

4.初始化完成返回如下

#您的Kubernetes控制平面初始化成功!
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

#你需要部署一个网络插件到集群中才能够使Kubernetes网络运转起来
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/

#如果要添加其它控制平面到集群中使用以下命令
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
  kubeadm join k8s-devops.io:6443 --token 8r7sjk.9a31rmcjot9650fe \
    --discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79 \
    --control-plane

#如果要添加数据平面节点到集群中使用以下命令
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join k8s-devops.io:6443 --token 8r7sjk.9a31rmcjot9650fe \
    --discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79

5.创建普通用户
我这里使用普通用户来进行维护kubernetes集群,当然你也可以使用root来维护

root@k8s-master01:~# useradd -m -s /bin/bash k8sops         #创建普通用户
root@k8s-master01:~# passwd k8sops                          #为普通用户设置密码
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

#为普通用户提权
root@k8s-master01:~# echo 'k8sops ALL=(ALL:ALL) NOPASSWD:ALL' >> /etc/sudoers.d/k8sops

6.使用普通用户创建配置文件

k8sops@k8s-master01:/$ mkdir -p $HOME/.kube                                      #在当前用户家目录下创建.kube目录
k8sops@k8s-master01:/$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  #复制config命令配置文件到当前用户.kube目录下
k8sops@k8s-master01:/$ sudo chown $(id -u):$(id -g) $HOME/.kube/config           #修改config文件权限

7.部署网络插件
为 Kubernetes 提供 Pod 网络插件的有很多,目前最流行的是 flannelCalico。相比较来说,flannel 以其简单、易部署、易用性广受欢迎。
基于 kubeadm 部署时,flannel 同样运行为 Kubernetes 集群的附件,以 Pod 的形式部署运行于每个集群节点上以接受 Kubernetes 集群管理。部署方式可以获取其资源清单于本地而后部署集群中,也可以直接在线进行应用部署。部署命令是 kubectl applykubectl create

#Step 1: 可以直接在线部署(如果网络下载不了的情况下,也可以先试用浏览器下载后上传到服务器上)
k8sops@k8s-master01:/$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

#Step 2: 如果上述方法还是不行,则就需要你使用某种方法下载到之后上传到服务器上(或则找我要也可以)

#Step 3: 上传完后修改文件的属性信息
k8sops@k8s-master01:/$ sudo chown -Rf k8sops.k8sops kube-flannel.yml

#Step 4: 然后指定文件部署网络插件
k8sops@k8s-master01:/$ kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created

#Step 5: 查看网络插件是否部署完成(下面有一个叫kube-flannel-ds-amd64的Pod)
#如果发现你的 flannel Pod 处于 ImagePullBackOff 状态,那么就是 flannel 镜像未拉取成功,而正常的则为 Running状态
k8sops@k8s-master01:/$ kubectl get pods -n kube-system | grep flannel
kube-flannel-ds-amd64-lbs5r            1/1     Running   0          4m19s

配置 flannel 网络插件时,Master 节点上的 Docker 首先会去获取 flannel 的镜像文件,而后根据镜像文件启动相应的 Pod 对象。待其运行完成后再次检查集群中的节点状态可以看出 Master 已经变为 “Ready” 状态。

k8sops@k8s-master01:/$ kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
k8s-master01   Ready    master   53m   v1.18.0

8.卸载flannel网络插件(可选)
如果你的网络插件 flannel 拉取失败,或需要重新部署此插件,可以使用 kubectl delete -f $uri 来进行删除此配置

#文件在本地可以直接指定文件卸载
kubectl delete -f kube-flannel.yml

#文件不在本地可以指定链接卸载
kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

添加数据平面节点到集群(Node节点)

所有Node节点操作
1.任何一个Node加入集群中的节点都需要先经过 API Server 完成认证,其认证方法和认证信息在 Master 上进行集群初始化的时 kubeadm init 命令执行时输出到了最后一行。
图示:

如果忘记了加入集群的命令,可通过 kubeadm token create --print-join-command 命令获取

在Node加入集群可以加上 --ignore-preflight-errors=Swap 选项来忽略Swap分区警告问题。(禁用swap的除外)
提供给 API Server 的 bootstap token 认证完成后,kubeadm join 命令会为后续 Master 与 Node 组件间的双向 ssl/tls 认证生成私钥及证书签署请求,并由 Nodee 在首次加入集群时提交给 Master 端的 CA 进行签署。默认情况下,kubeadm 配置 kube-apiserver 启用了 bootstrap TLS功能,并支持证书的自动签署。于是,kubelet 及 kube-proxy 等组件的相关私钥和证书文件在命令执行结束后便可自动生成,他们默认存储于 /var/lib/kubelet/pki目录中

2.Node节点加入集群

#Node1加入集群
root@k8s-node01:~# kubeadm join k8s-devops.io:6443 --token 8r7sjk.9a31rmcjot9650fe \
    --discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79

#Node2加入集群
root@k8s-node02:~# kubeadm join k8s-devops.io:6443 --token 8r7sjk.9a31rmcjot9650fe \
    --discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79

#Node3加入集群
root@k8s-node03:~# kubeadm join k8s-devops.io:6443 --token 8r7sjk.9a31rmcjot9650fe \
    --discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79

3.Master查看加入到集群的节点

#查看加入到集群中的节点
k8sops@k8s-master01:~$ kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
k8s-master01   Ready    master   9h      v1.18.0
k8s-node01     Ready    <none>   6m40s   v1.18.0
k8s-node02     Ready    <none>   2m35s   v1.18.0
k8s-node03     Ready    <none>   2m32s   v1.18.0

#详细查看加入到集群节点的信息
k8sops@k8s-master01:~$ kubectl get nodes -o wide
NAME           STATUS   ROLES    AGE     VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
k8s-master01   Ready    master   9h      v1.18.0   192.168.31.221   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-node01     Ready    <none>   7m51s   v1.18.0   192.168.31.231   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-node02     Ready    <none>   3m46s   v1.18.0   192.168.31.232   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-node03     Ready    <none>   3m43s   v1.18.0   192.168.31.233   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0

#查看名称空间,默认的名称空间有三个分为为:默认 Pod 名称空间 default,公开 Pod 名称空间 kube-public,系统 Pod 名称空间 kube-system
k8sops@k8s-master01:~$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   9h
kube-node-lease   Active   9h
kube-public       Active   9h
kube-system       Active   9h

#查看系统名称空间中的Pod
k8sops@k8s-master01:~$ kubectl get pods -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-7ff77c879f-vmjtl               1/1     Running   0          9h
coredns-7ff77c879f-zwkrc               1/1     Running   0          9h
etcd-k8s-master01                      1/1     Running   0          9h
kube-apiserver-k8s-master01            1/1     Running   0          9h
kube-controller-manager-k8s-master01   1/1     Running   0          9h
kube-flannel-ds-amd64-5j67k            1/1     Running   0          8m12s
kube-flannel-ds-amd64-9c5hr            1/1     Running   0          8h
kube-flannel-ds-amd64-hjfdp            1/1     Running   0          4m7s
kube-flannel-ds-amd64-lxnl2            1/1     Running   0          4m4s
kube-proxy-rctb5                       1/1     Running   0          4m4s
kube-proxy-vkmfr                       1/1     Running   0          9h
kube-proxy-xgtkf                       1/1     Running   0          8m12s
kube-proxy-zgkfx                       1/1     Running   0          4m7s
kube-scheduler-k8s-master01            1/1     Running   2          9h

以上就完成了单个控制平面和三个数据平面的集群部署,以下演示把剩下的两个控制平面(Master节点)加入到控制平面中

添加新的控制平面

如果要添加新的控制平面,需要将第一个控制平面上的密钥分发至待加入的控制平面节点上,常用方法有两种:

  1. 手动分发(比较麻烦)
  2. 将相关密钥上传为kube-system名称空间中的secrets,名为kubeadm-certs

以下演示两种方式

手动分发

手动分发的话需要将master01下的以下证书和密钥拷贝至master02和master03的相同目录下即可(无论你是通过scp还是其它方式,只要将master01的以下这些密钥拷贝到master02和master03的相同目录下即可)

/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/ca.key
/etc/kubernetes/pki/sa.pub
/etc/kubernetes/pki/sa.key
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-ca.key
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key

上传到kube-system名称空间

1.master01将相关密钥上传到kube-system名称空间

#把证书上传到kube-system名称空间中的secrets,名称为kubeadm-certs
k8sops@k8s-master01:/$ sudo kubeadm init phase upload-certs --upload-certs          #kubeadm命令需要root执行
W0427 10:36:08.692030   27634 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:           #上传成功
97d161e855b092907b504c846805a6630c55cc19f0b423200b8a78def41527ab   #记住此密钥,下面新增控制平面需要

2.查看上传的密钥

#kubectl属于集群管理员命令,不是root,root查看不到这些
k8sops@k8s-master01:/$ kubectl get secrets -n kube-system | grep certs
kubeadm-certs                                    Opaque                                8      3m36s

3.添加master02和master03到控制平面
以下命令是来自我们在master01初始化控制平面时最后输出的信息
--certificate-key 需要指定上面master01将密钥上传到kube-system名称空间时打印的密钥

#master02加入控制平面
root@k8s-master02:~# kubeadm join k8s-devops.io:6443 --token 8r7sjk.9a31rmcjot9650fe \
--discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79 \
--control-plane --certificate-key 97d161e855b092907b504c846805a6630c55cc19f0b423200b8a78def41527ab

以上master02加入控制平面失败了,错误在下面

4.控制平面加入集群失败
使用master02和master03加入集群时,报错如下,说我Token过期,无法验证;
因为我master01部署时间过长,我们在初始化master01的时候,有一个--token-ttl的参数,用来指定token的过期时间,上面指定的是30m,我这里超出了30m,所以加入集群失败,看以下报错

error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "8r7sjk"
To see the stack trace of this error execute with --v=5 or higher

5.解决办法,在master01上重新生成Token

k8sops@k8s-master01:/$ sudo kubeadm token create
W0427 11:29:13.138805    5894 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
2t8xc9.fjzdw2smqxyvnnvk #这是生成的token

6.重新加入到控制平面
将新生成的token替换到 –token 指定的令牌

#Master02加入控制平面
root@k8s-master02:~# kubeadm join k8s-devops.io:6443 --token 2t8xc9.fjzdw2smqxyvnnvk \
--discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79 \
--control-plane --certificate-key 97d161e855b092907b504c846805a6630c55cc19f0b423200b8a78def41527ab

#Master03加入控制平面
root@k8s-master03:~# kubeadm join k8s-devops.io:6443 --token 2t8xc9.fjzdw2smqxyvnnvk \
> --discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79 \
> --control-plane --certificate-key 97d161e855b092907b504c846805a6630c55cc19f0b423200b8a78def41527ab

7.查看master02和master03是否加入控制平面

k8sops@k8s-master01:/$ kubectl get nodes -o wide

下图中加入集群时master的两种状态
NotReady:已加入集群,但是未就绪
Ready:已加入集群,已经就绪

获取集群状态信息

1.kubeadm init 初始化信息可通过 kubeadm config 命令来进行导出为 yaml 格式的文件

root@k8s-master01:~# kubeadm config print init-defaults > kubeadm-init.yaml
root@k8s-master01:~# cat kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef                        
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}

2.Kubernetes集群Server端和Client端的版本等信息可以使用 kubectl version 命令进行查看

#kubectl命令需要集群管理员来进行使用
root@k8s-master01:~# su k8sops  
k8sops@k8s-master01:/root$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:58:59Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:50:46Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}

#默认version输出信息太多,使用 --short=true 来过滤
k8sops@k8s-master01:/root$ kubectl version --short=true
Client Version: v1.18.0
Server Version: v1.18.0

3.查看Kubernetes集群的API Server地址
如下 k8s-devops.io 就是我们集群的API Server地址,我们在master01初始化集群时用到的 --control-plane-endpoint 参数来指定API Server地址,API Server地址经常被集群中的其它组件所调用,如果你是单个控制平面,默认API Server地址为单个控制平面的IP地址。

k8sops@k8s-master01:/root$ kubectl cluster-info
Kubernetes master is running at https://k8s-devops.io:6443
KubeDNS is running at https://k8s-devops.io:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

也可以使用 kubectl cluster-info dump 来获取 kubernetes 集群的更多信息 metadata元数据

集群管理

数据平面剔除后重新加入

运行过程中,若有节点需要从正常运行的集群中移除,则可使用如下步骤进行。
例如我们将 k8s-node02 从 kubernetes 集群中移除,如下:
1.在Master使用 kubectl drain 命令将 k8s-node02 上的所有资源迁移至集群中的其它节点(如果k8s-node2上没有除系统Pod外的其它Pod则无需使用此命令)

#移除k8s-node02上的所有资源到其它node,以至于将资源移动到哪台Node还要根据scheduler组件去调度
k8sops@k8s-master01:/root$ kubectl drain k8s-node02 --delete-local-data --force --ignore-daemonsets

#查看被移除后的Node状态,目前Node02是一个被调度禁用的状态,意思为不会再将其它资源调度到这台Node上,当然这台Node的资源也已经被移除
k8sops@k8s-master01:/root$ kubectl get nodes
NAME           STATUS                     ROLES    AGE    VERSION
k8s-master01   Ready                      master   11h    v1.18.0
k8s-master02   Ready                      master   27m    v1.18.0
k8s-master03   Ready                      master   27m    v1.18.0
k8s-node01     Ready                      <none>   149m   v1.18.0
k8s-node02     Ready,SchedulingDisabled   <none>   145m   v1.18.0
k8s-node03     Ready                      <none>   145m   v1.18.0

2.从 Kubernetes 集群中移除 k8s-node02 节点

#移除k8s-node02数据节点
k8sops@k8s-master01:/root$ kubectl delete node k8s-node02
node "k8s-node02" deleted

#在此查看集群节点状态,node02已经被移除集群
k8sops@k8s-master01:/root$ kubectl get nodes
NAME           STATUS   ROLES    AGE    VERSION
k8s-master01   Ready    master   11h    v1.18.0
k8s-master02   Ready    master   31m    v1.18.0
k8s-master03   Ready    master   31m    v1.18.0
k8s-node01     Ready    <none>   153m   v1.18.0
k8s-node03     Ready    <none>   149m   v1.18.0

3.将 k8s-node02 重新加入Kubernetes集群

#在Master01获取加入集群 token
k8sops@k8s-master01:/root$ sudo su -
root@k8s-master01:~# kubeadm token create --print-join-command
W0427 12:08:46.325074   14585 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join k8s-devops.io:6443 --token 2c39uo.okx027x8p1f1bods     --discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79

在k8s-node02上进行加入操作,加入集群前必须先经过重置,因之前有加入集群的信息存在,须先使用 kubeadm reset 命令重置Node02

#重置Node02
root@k8s-node02:~# kubeadm reset
[reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y

#重新加入集群
root@k8s-node02:~# kubeadm join k8s-devops.io:6443 \
--token 2c39uo.okx027x8p1f1bods \
--ignore-preflight-errors=Swap \
--discovery-token-ca-cert-hash \
sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79

4.在Master01获取集群节点
可以看到如下Node02已经被加入集群

k8sops@k8s-master01:/root$ kubectl get nodes
NAME           STATUS   ROLES    AGE    VERSION
k8s-master01   Ready    master   11h    v1.18.0
k8s-master02   Ready    master   38m    v1.18.0
k8s-master03   Ready    master   38m    v1.18.0
k8s-node01     Ready    <none>   161m   v1.18.0
k8s-node02     Ready    <none>   50s    v1.18.0
k8s-node03     Ready    <none>   156m   v1.18.0

控制平面剔除后重新加入

在Kubernetes运行中,假如一个控制平面出了故障,那么就会退出集群,以下演示控制平面移除集群后重新加入
1.剔除控制平面节点

#移除控制平面master02节点
k8sops@k8s-master01:~$ kubectl delete node k8s-master02
node "k8s-master02" deleted

#此时查看kubectl节点,master02已经被剔除
k8sops@k8s-master01:~$ kubectl get nodes -n default -o wide
NAME           STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
k8s-master01   Ready    master   34h   v1.18.0   192.168.31.221   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-master03   Ready    master   23h   v1.18.0   192.168.31.223   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-node01     Ready    <none>   17h   v1.18.0   192.168.31.231   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-node02     Ready    <none>   13h   v1.18.0   192.168.31.232   <none>        Ubuntu 18.04.4 LTS   4.15.0-96-generic   docker://18.6.0
k8s-node03     Ready    <none>   25h   v1.18.0   192.168.31.233   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0

2.master01重新生成Token及上传证书到名称空间

#生成Token
k8sops@k8s-master01:~$ sudo kubeadm token create
W0428 11:14:36.558041    3972 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
z521w7.own94zhfabk8bsgq

#上传证书CA到kube-system名称空间,如果不重新生成CA会在两个小时内失效
k8sops@k8s-master01:~$ sudo kubeadm init phase upload-certs --upload-certs
W0428 11:19:54.117633    5052 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
d657708eb694e995b672b68cfc82fa20bd1c06b267a69334314d0262516ee115

#查看生成的CA
k8sops@k8s-master01:~$ kubectl get secrets -n kube-system -o wide | grep certs
kubeadm-certs                                    Opaque                                8      19s

3.将master02重新加入集群

#重置master02的集群配置信息
root@k8s-master02:~# kubeadm reset

#master02重新加入集群
root@k8s-master02:~# kubeadm join k8s-devops.io:6443 --token z521w7.own94zhfabk8bsgq \
--discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79 \
--control-plane --certificate-key d657708eb694e995b672b68cfc82fa20bd1c06b267a69334314d0262516ee115

在master02加入集群时,输出下面日志,提示etcd集群不健康,监控检查失败

[check-etcd] Checking that the etcd cluster is healthy
error execution phase check-etcd: etcd cluster is not healthy: failed to dial endpoint https://192.168.31.222:2379 with maintenance client: context deadline exceeded
To see the stack trace of this error execute with --v=5 or highe

4.问题排查与分析
查看集群列表,确实发现k8s-master02不在集群中

k8sops@k8s-master01:~$ kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
k8s-master01   Ready    master   35h   v1.18.0
k8s-master03   Ready    master   23h   v1.18.0
k8s-node01     Ready    <none>   17h   v1.18.0
k8s-node02     Ready    <none>   13h   v1.18.0
k8s-node03     Ready    <none>   25h   v1.18.0

在看看 Kubernetes 集群中的 kubeadm 配置信息:

k8sops@k8s-master01:~$ kubectl describe configmaps kubeadm-config -n kube-system
Name:         kubeadm-config
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>
...
ClusterStatus:
----
apiEndpoints:
  k8s-master01:
    advertiseAddress: 192.168.31.221
    bindPort: 6443
  k8s-master02:
    advertiseAddress: 192.168.31.222
    bindPort: 6443
  k8s-master03:
    advertiseAddress: 192.168.31.223
    bindPort: 6443
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterStatus

可以看到k8s-master02还在集群状态中,master02的信息还存储在kubeadm配置中,说明etcd中还存储着master02的状态信息。

因为集群是通过 kubeadm 工具搭建的,且使用了 etcd 镜像方式与 master 节点一起,所以每个 Master 节点上都会存在一个 etcd 容器实例。当剔除一个 master 节点时 etcd 集群未删除剔除的节点的 etcd 成员信息,该信息还存在 etcd 集群列表中。
所以我们要进入etcd手动删除etcd成员信息。

5.进入etcd删除master02的配置信息

#获取etcd的pod列表
k8sops@k8s-master01:~$ kubectl get pods -n kube-system | grep etcd
etcd-k8s-master01                      1/1     Running   0          35h
etcd-k8s-master03                      1/1     Running   0          24h

#上面还有两个master的etcd pod,进入任何一个都可以

#进入master01的etcd 容器
k8sops@k8s-master01:~$ kubectl exec -it etcd-k8s-master01 sh -n kube-system

#配置环境
#export ETCDCTL_API=3
# alias etcdctl='etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key'

#查看etcd成员列表
# etcdctl member list
4a82f1c0a60e2542, started, k8s-master01, https://192.168.31.221:2380, https://192.168.31.221:2379, false
746485b21b82f45d, started, k8s-master03, https://192.168.31.223:2380, https://192.168.31.223:2379, false
9cf1ca49b418d873, started, k8s-master02, https://192.168.31.222:2380, https://192.168.31.222:2379, false

#移除master02的etcd成员
# etcdctl member remove 9cf1ca49b418d873
Member 9cf1ca49b418d873 removed from cluster f6c9436c25d71b02

#再次查看etcd成员列表
# etcdctl member list
4a82f1c0a60e2542, started, k8s-master01, https://192.168.31.221:2380, https://192.168.31.221:2379, false
746485b21b82f45d, started, k8s-master03, https://192.168.31.223:2380, https://192.168.31.223:2379, false

#退出容器
# exit

6.master02再次加入集群

#再次重置节点状态(刚才加入集群失败,有一些配置残留),清空iptables规则,再次加入集群
root@k8s-master02:~# kubeadm reset
root@k8s-master02:~# iptables -F
root@k8s-master02:~# kubeadm join k8s-devops.io:6443 --token z521w7.own94zhfabk8bsgq \
--discovery-token-ca-cert-hash sha256:b939982edd6cb1e9d3f99739ae8de7b8f9574386984168231e0e0fc1bf8d2e79 \
--control-plane --certificate-key d657708eb694e995b672b68cfc82fa20bd1c06b267a69334314d0262516ee115

7.查看集群节点状态
可以看到如下,master02已经加入集群的控制平面

k8sops@k8s-master01:~$ kubectl get nodes -o wide
NAME           STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
k8s-master01   Ready    master   35h   v1.18.0   192.168.31.221   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-master02   Ready    master   91s   v1.18.0   192.168.31.222   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-master03   Ready    master   24h   v1.18.0   192.168.31.223   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-node01     Ready    <none>   17h   v1.18.0   192.168.31.231   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0
k8s-node02     Ready    <none>   13h   v1.18.0   192.168.31.232   <none>        Ubuntu 18.04.4 LTS   4.15.0-96-generic   docker://18.6.0
k8s-node03     Ready    <none>   26h   v1.18.0   192.168.31.233   <none>        Ubuntu 18.04.4 LTS   4.15.0-76-generic   docker://18.6.0

为集群内其它节点添加kubectl命令

kubectl命令为我们在控制平面初始化完成后打印出来的配置信息,如下所示,将admin.conf文件复制到当前用户家目录下才能够使用该命令,我们上面在Master上使用了一个普通用户来管理kubernetes集群,提高了一定的安全性。

#要开始使用您的集群,您需要作为一个普通用户运行以下程序:
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

1.为其它控制平面添加kubectl权限
如果不做设置,默认其它控制节点是无法使用kubectl命令,以下为例,还创建普通用户来使用kubectl命令

#Master02和Master03操作
root@k8s-master03:~# useradd -m -s /bin/bash k8sops
root@k8s-master03:~# passwd k8sops
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@k8s-master03:~# echo 'k8sops ALL=(ALL:ALL) NOPASSWD:ALL' >> /etc/sudoers.d/k8sops
root@k8s-master03:~# su - k8sops
k8sops@k8s-master03:~$ mkdir -p $HOME/.kube
k8sops@k8s-master03:~$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
k8sops@k8s-master03:~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

以上操作完成后,master02和master03的k8sops用户都可以使用 kubectl 命令,如下

k8sops@k8s-master02:/root$ kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
k8s-master01   Ready    master   13h     v1.18.0
k8s-master02   Ready    master   160m    v1.18.0
k8s-master03   Ready    master   159m    v1.18.0
k8s-node01     Ready    <none>   4h42m   v1.18.0
k8s-node02     Ready    <none>   122m    v1.18.0
k8s-node03     Ready    <none>   4h38m   v1.18.0

2.为数据平面添加kubectl权限
上面给管理节点添加了kubectl权限,那么这里也给Node来添加kubectl权限,Node与Master不同的是,Node默认没有admin.conf文件,所以要从控制平面将admin.conf拷贝到控制平面,然后下面操作与Master操作相同,但是也有弊端,如果在Node节点添加了kubectl权限,那么Node节点上也可以使用kubectl命令进行管理集群(我感觉这样不太好…),你要是想这样做就按照上述步骤去吧,我不做了

集群测试高可用

Kubernetes常用命令

查看Kubernetes集群所支持的资源类型

kubectl api-resources

kubectl get

通过kubectl api-resources获取到集群所支持的资源类型后,使用 kubectl get [资源类型] 都可以获取,下面讲解常用的资源类型

1.kubecel get nodes

#显示集群节点状态
kubectl get nodes

#以长格式显示集群节点状态
kubectl get nodes -o wide

#以yaml格式显示集群节点状态
kubectl get nodes -o yaml

#以json格式显示集群节点状态
kubectl get nodes -o json

2.kubectl get namespaces
在kubernetes上,资源有两个级别,node就是集群级别,pod是名称空间级别的资源,整个集群又划分为多个名称空间,所以在此使用kubectl get namespaces来获取名称空间,kubenetes安装完默认有三个名称空间:
kube-system名称空间:系统级别的Pod都运行在此名称空间中
default默认名称空间:假如说你创建了一个Pod没有指定名称空间,默认在default名称空间当中
kube-public公共名称空间:公开的名称空间,任何人都可以访问

#显示所有的名称空间
kubectl get ns
kubectl get namespaces

#显示指定名称空间
kubectl get ns kube-system
kubectl get ns/kube-system
kubectl get namespaces kube-system
kubectl get namespaces/kube-system

3.显示Pod
Pod是在名称空间之上的,我们创建Pod的时候要指定名称空间,如果没指定就会在系统默认的default名称空间中,所以我们查看Pod的时候一般需要指定名称空间。

#直接查看pod,默认查看的是default名称空间中的pod
kubectl get pods

#查看指定名称空间下的pod,使用 -n 选项指定名称空间
kubectl get pods -n default
kubectl get pods -n kube-system

#长格式显示指定名称空间下的pod
kubectl get pods -n kube-system -o wide

#yaml格式显示指定名称空间下的pod
kubectl get pods -n kube-system -o yaml

#json格式显示指定名称空间下的pod
kubectl get pods -n kube-system -o json


pod状态解析:
NAME:Pod名称
READY:是否就绪
STATUS:Pod状态
RESTARTS:Pod重启状态
AGE:Pod运行时间
IP:Pod地址
NODE:Pod运行在的Node

部署dashboard可视化插件







「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论