写在之前
只2017年开始,断断续续的接触k8s也是有几个年头了,从1.11开始到现在马上都1.20了,真快呀!之前就有想整理下所有技术的想法,毕竟已经35岁的人,闯荡江湖已经12个年头了。是该总结下了,这行说实话干不了几年了。话不多说,等专门写一篇感慨的文章。开整!
一. k8s简介
这块我不会讲的太多,毕竟k8s一个很大的体系,不是一两句话或者两三句话就可以说清楚的。可能说的太深了我也未必能说的清楚,主要是说不清楚吧。但是简单的我还是要说下,主要是应对面试吧。但是说实话理论这事儿干的深了很重要的,在排错的时候,如果有理论加持会事半功倍,很容易地位错误。如果对于理论不大理解,那就是撞大运。想想是不是应该多写点理论? 还是算了吧,等等看,时间充足了,再说吧。
1. k8s 的整体架构
这块不太多说了,先上图。不是我自己画的,copy哪个大仙的,有侵权的喊我。我换其他大仙的。
总体来说k8s可以分为两个部分,master和node两个部分。
- master 由四个模块组成,APIServer,schedule,controller-manager,etcd.
APIServer: APIServer负责对外提供RESTful的kubernetes API的服务,它是系统管理指令的统一接口,任何对资源的增删该查都要交给APIServer处理后再交给etcd,kubectl(kubernetes提供的客户端工具,该工具内部是对kubernetes API的调用)是直接和APIServer交互的。
schedule: schedule负责调度Pod到合适的Node上,如果把scheduler看成一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定。 kubernetes目前提供了调度算法,同样也保留了接口。用户根据自己的需求定义自己的调度算法。
controller manager: 如果APIServer做的是前台的工作的话,那么controller manager就是负责后台的。每一个资源都对应一个控制器。而controller manager就是负责管理这些控制器的,比如我们通过APIServer创建了一个Pod,当这个Pod创建成功后,APIServer的任务就算完成了。
etcd:etcd是一个高可用的键值存储系统,kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。
- Node节点主要由三个模板组成:kublet, kube-proxy,Docker
kube-proxy: 该模块实现了kubernetes中的服务发现和反向代理功能。kube-proxy支持TCP和UDP连接转发,默认基Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响,另外,kube-proxy还支持session affinity。
kublet:kublet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上的所有容器,但是如果容器不是通过kubernetes创建的,它并不会管理。本质上,它负责使Pod的运行状态与期望的状态一致。
Docker:进行容器生成、配置和使用,作为pod节点的重要支撑。
这玩意儿就说到这里,再详细的不多学了,我不做大自然的搬运工了。面试的话基本上就问这些基本的,往深了就是pod,pv,pvc这类的。等专门写写这块内容。其他也就没嘛了,面试官也不太敢往深了搞,关键是他也的会哈,百分之八十的都是这样,当然牛人也是很多的。
2. 部署说明
首先需要说明的是,为了快捷很多东西直接用ansible做的,简单的ansible的命令,没有涉及到playbook的东西,以后可能会做一套这东西。但是现在觉得没拿必要。如果哪位同志想搞这块的内容,可以单独的找我,咱们一起探讨。还有,我内网做了本地dns,直接采用相关域名操作,没有进行主机的后饰条文件设置。最后,我自己做了本地的yum源,很多包可能在网络部署的时候会没有,这个别担心自己找找就可以,没什么大不了的事儿。不能指着一篇文档发家致富,工作很多时候还的靠自己。我这边做的是我们的测试环境,线上环境大同小异,也是这个样做的,我们的node节点大概会有十几台,我这里会写一台吧,如果说不清可能最多写两台node节点。另外我的ansible是单独的一台机器。各位战友可根据自己的环境进行调整,不多说了,具体规划如下:
角色 |
ip |
主机名称 | 组件 |
---|---|---|---|
master-01 |
10.120.200.2 |
k8s-master01.k8s.com | kube-apiserver,kube-controller-manager,kube-scheduler,etcd |
master-02 |
10.120.200.3 |
k8s-master02.k8s.com | kube-apiserver,kube-controller-manager,kube-scheduler,etcd |
node-01 |
10.120.200.10 |
k8s-node01.k8s.com | kubelet,kube-proxy,docker, etcd |
node-02 |
10.120.200.4 |
k8s-node02.k8s.com | kubelet,kube-proxy,docker ,ansible |
3. ansible host文件说明
[master]
k8s-master01.k8s.com
k8s-master02.k8s.com[node]
k8s-node01.k8s.com
k8s-node02.k8s.com[etcd]
k8s-master01.k8s.com
k8s-master02.k8s.com
k8s-node07.k8s.com
二. 基础系统部署
1. 设置关闭防火墙及SELINUX
-
ansible all -m shell -a "systemctl stop firewalld && systemctl disable firewalld"
-
ansible all -m shell -a "setenforce 0"
-
ansible all -m shell -a "yum install yum-utils -y"
-
ansible all -m shell -a "sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config"
2. 关闭Swap
-
ansible all -m shell -a "swapoff -a && sysctl -w vm.swappiness=0"
-
ansible all -m shell -a "sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab"
3.升级linux内核
-
ansible all -m shell -a "mkdir /data/"
-
ansible all -m copy -a "src=./kernel-ml-5.11.8-1.el7.elrepo.x86_64.rpm dest=/data/ "
-
ansible all -m shell -a "chdir=/data rpm -ivh kernel-ml-5.11.8-1.el7.elrepo.x86_64.rpm"
-
ansible all -m shell -a "grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg"
-
#查看启动默认内核指向上面安装的内核
-
ansible all -m shell -a "grubby --default-kernel"
-
#顺手更新下系统,由于使用yum update命令更新,时间或者显示的问题可能有用ansible会有错误。可以到每台机器上去执行命令
-
ansible all -m shell -a "yum update -y"
-
ansible all -m shell -a "reboot"
4.优化内核参数
-
cat > kubernetes.conf <<EOF
-
net.bridge.bridge-nf-call-iptables=1
-
net.bridge.bridge-nf-call-ip6tables=1
-
net.ipv4.ip_forward=1
-
#net.ipv4.tcp_tw_recycle=0
-
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
-
vm.overcommit_memory=1 # 不检查物理内存是否够用
-
vm.panic_on_oom=0 # 开启 OOM
-
fs.inotify.max_user_instances=8192
-
fs.inotify.max_user_watches=1048576
-
fs.file-max=52706963
-
fs.nr_open=52706963
-
net.ipv6.conf.all.disable_ipv6=1
-
net.netfilter.nf_conntrack_max=2310720
-
EOF
-
ansible all -m copy -a "src=./kubernetes.conf dest=/etc/sysctl.d/"
-
ansible all -m shell -a "sysctl -p /etc/sysctl.d/kubernetes.conf"
正在上传…重新上传取消
5. 开启 ipvs
-
cat > ipvs.modules <<EOF
-
#!/bin/bash
-
modprobe -- ip_vs
-
modprobe -- ip_vs_rr
-
modprobe -- ip_vs_wrr
-
modprobe -- ip_vs_sh
-
modprobe -- nf_conntrack
-
EOF
-
ansible all -m copy -a "src=./ipvs.modules dest=/etc/sysconfig/modules/"
-
ansible all -m shell -a "chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4"
6. 设置系统时区
-
ansible all -m shell -a "timedatectl set-timezone Asia/Shanghai"
-
#将当前的 UTC 时间写入硬件时钟
-
ansible all -m shell -a "timedatectl set-local-rtc 0"
-
#重启依赖于系统时间的服务
-
ansible all -m shell -a "systemctl restart rsyslog "
-
ansible all -m shell -a "systemctl restart crond"
7.创建相关目录
ansible all -m shell -a "mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert"
8.设置环境变量脚本
所有环境变量都定义在environment.sh中,需要根据环境修改。并且需要拷贝到所有节点的/opt/k8s/bin目录下
-
#!/usr/bin/bash
-
# 生成 EncryptionConfig 所需的加密 key
-
export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
-
# 集群各机器 IP 数组
-
export NODE_IPS=( 10.120.200.2 10.120.200.3 10.120.200.10 )
-
# 集群各 IP 对应的主机名数组
-
export NODE_NAMES=(k8s-master02 k8s-master01 k8s-node07)
-
# 集群MASTER机器 IP 数组
-
export MASTER_IPS=(10.120.200.2 10.120.200.3 )
-
# 集群所有的master Ip对应的主机
-
export MASTER_NAMES=(k8s-master02 k8s-master01)
-
# etcd 对应主机列表
-
export ETCD_NAMES=(k8s-master02 k8s-master01 k8s-node07)
-
# etcd 集群服务地址列表
-
export ETCD_ENDPOINTS="https://10.120.200.2:2379,https://10.120.200.3:2379,https://10.120.200.10:2379"
-
# etcd 集群间通信的 IP 和端口
-
export ETCD_NODES="k8s-01=https://10.120.200.2:2380,k8s-02=https://10.120.200.3:2380,k8s-03=https://10.120.200.10:2380"
-
# etcd 集群所有node ip
-
export ETCD_IPS=(192.110.120.200.2 10.120.200.3 10.120.200.10 )
-
# kube-apiserver 的反向代理(kube-nginx)地址端口
-
export KUBE_APISERVER="https://10.120.200.100:8443"
-
# 节点间互联网络接口名称
-
export IFACE="eth0"
-
# etcd 数据目录
-
export ETCD_DATA_DIR="/data/k8s/etcd/data"
-
# etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区
-
export ETCD_WAL_DIR="/data/k8s/etcd/wal"
-
# k8s 各组件数据目录
-
export K8S_DIR="/data/k8s/k8s"
-
# docker 数据目录
-
#export DOCKER_DIR="/data/k8s/docker"
-
## 以下参数一般不需要修改
-
# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
-
#BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"
-
# 最好使用 当前未用的网段 来定义服务网段和 Pod 网段
-
# 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 保证)
-
SERVICE_CIDR="10.254.0.0/16"
-
# Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证)
-
CLUSTER_CIDR="172.30.0.0/16"
-
# 服务端口范围 (NodePort Range)
-
export NODE_PORT_RANGE="1024-32767"
-
# flanneld 网络配置前缀
-
export FLANNEL_ETCD_PREFIX="/kubernetes/network"
-
# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
-
export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"
-
# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
-
export CLUSTER_DNS_SVC_IP="10.254.0.2"
-
# 集群 DNS 域名(末尾不带点号)
-
export CLUSTER_DNS_DOMAIN="cluster.local"
-
# 将二进制目录 /opt/k8s/bin 加到 PATH 中
-
export PATH=/opt/k8s/bin:$PATH
正在上传…重新上传取消
-
ansible all -m copy -a "src=./environment.sh dest=/opt/k8s/bin"
-
ansible all -m shell -a "chdir=/opt/k8s/bin chmod 755 ./environment.sh"
基本上系统前期基础部署到这里就完成了。这些内容每天master和node均需要操作。在ansible中采用了all 这个参数选项。接下来开始做master组件部署。
三. 创建证书
1. 安装cfssl工具集
-
ansible k8s-master01.k8s.com -m shell -a "mkdir -p /opt/k8s/cert"
-
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
-
mv cfssl_linux-amd64 cfssl
-
ansible k8s-master01.k8s.com -m copy -a "src=./cfssl dest=/opt/k8s/bin/"
-
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
-
mv cfssljson_linux-amd64 cfssljson
-
ansible k8s-master01.k8s.com -m copy -a "src=./cfssljson dest=/opt/k8s/bin/"
-
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
-
mv cfssl-certinfo_linux-amd64 cfssl-certinfo
-
ansible k8s-master01.k8s.com -m copy -a "src=./cfssl-certinfo dest=/opt/k8s/bin/"
-
ansible k8s-master01.k8s.com -m shell -a "chmod +x /opt/k8s/bin/*"
-
ansible k8s-master01.k8s.com -m shell -a "export PATH=/opt/k8s/bin:$PATH"
这部分可以在master01机器上操作,但是我这环境master 没有外网,只能在ansible机器下载然后推过去了。
2.创建证书
-
cat > ca-config.json <<EOF
-
{
-
"signing": {
-
"default": {
-
"expiry": "87600h"
-
},
-
"profiles": {
-
"kubernetes": {
-
"usages": [
-
"signing",
-
"key encipherment",
-
"server auth",
-
"client auth"
-
],
-
"expiry": "87600h"
-
}
-
}
-
}
-
}
-
EOF
正在上传…重新上传取消
-
cat > ca-csr.json <<EOF
-
{
-
"CN": "kubernetes",
-
"key": {
-
"algo": "rsa",
-
"size": 2048
-
},
-
"names": [
-
{
-
"C": "CN",
-
"ST": "TJ",
-
"L": "TJ",
-
"O": "k8s",
-
"OU": "4Paradigm"
-
}
-
],
-
"ca": {
-
"expiry": "876000h"
-
}
-
}
-
EOF
正在上传…重新上传取消
-
ansible k8s-master01.k8s.com -m copy -a "src=./ca-config.json dest=/opt/k8s/work/"
-
ansible k8s-master01.k8s.com -m copy -a "src=./ca-csr.json dest=/opt/k8s/work/"
将生成的json文件推送到master01中。
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work /opt/k8s/bin/cfssl gencert -initca ca-csr.json | /opt/k8s/bin/cfssljson -bare ca"
-
#查看生成的文件
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work ls ca*"
3. 分发证书
-
ansible k8s-master01.k8s.com -m shell -a "source /opt/k8s/bin/environment.sh"
-
source /opt/k8s/bin/environment.sh
-
ansible all -m shell -a "mkdir -p /etc/kubernetes/cert"
-
for node_ip in ${NODE_IPS[@]}; do echo ">>> ${node_ip}"; ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work scp ca*.pem ca-config.json root@${node_ip}:/etc/kubernetes/cert"; done
4. 部署kubectl命令行工具
-
ansible all -m copy -a "src=./kubectl dest=/opt/k8s/bin"
-
ansible all -m shell -a "chdir=/opt/k8s/bin chmod +x ./* "
5. 生成admin 证书
生成admin-csr.json的文件
-
{
-
"CN": "admin",
-
"hosts": [],
-
"key": {
-
"algo": "rsa",
-
"size": 2048
-
},
-
"names": [
-
{
-
"C": "CN",
-
"ST": "TJ",
-
"L": "TJ",
-
"O": "system:masters",
-
"OU": "4Paradigm"
-
}
-
]
-
}
正在上传…重新上传取消
-
ansible k8s-master01.k8s.com -m copy -a "src=./admin-csr.json dest=/opt/k8s/work/"
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work /opt/k8s/bin/cfssl gencert -ca=/opt/k8s/work/ca.pem -ca-key=/opt/k8s/work/ca-key.pem -config=/opt/k8s/work/ca-config.json -profile=kubernetes admin-csr.json | /opt/k8s/bin/cfssljson -bare admin"
-
#查看文件
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work ls admin*"
-
admin.csr
-
admin-csr.json
-
admin-key.pem
-
admin.pem
6.生成kubeconfig文件
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work source /opt/k8s/bin/environment.sh"
-
## 设置集群参数
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work /opt/k8s/bin/kubectl config set-cluster kubernetes \
-
--certificate-authority=/opt/k8s/work/ca.pem \
-
--embed-certs=true \
-
--server=${KUBE_APISERVER} \
-
--kubeconfig=kubectl.kubeconfig"
-
#设置客户端认证参数
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work /opt/k8s/bin/kubectl config set-credentials admin \
-
--client-certificate=/opt/k8s/work/admin.pem \
-
--client-key=/opt/k8s/work/admin-key.pem \
-
--embed-certs=true \
-
--kubeconfig=kubectl.kubeconfig"
-
# 设置上下文参数
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work /opt/k8s/bin/kubectl config set-context kubernetes \
-
--cluster=kubernetes \
-
--user=admin \
-
--kubeconfig=kubectl.kubeconfig"
-
# 设置默认上下文
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work /opt/k8s/bin/kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig"
-
#文件分发
-
ansible all -m shell -a "mkdir -p ~/.kube "
-
for node_ip in ${NODE_IPS[@]}; do echo ">>> ${node_ip}"; ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work scp kubectl.kubeconfig root@${node_ip}:~/.kube/config"; done
正在上传…重新上传取消
四.ETCD部署
1. 分发文件
-
tar -zxf etcd-v3.3.25-linux-amd64.tar.gz
-
cd etcd-v3.3.25-linux-amd64
-
ansible etcd -m copy -a "src=./etcd dest=/opt/k8s/bin"
-
ansible etcd -m copy -a "src=./etcdctl dest=/opt/k8s/bin"
-
ansible etcd -m shell -a "chdir=/opt/k8s/bin chmod +x *"
2. 创建etcd证书和私钥
生成etcd-csr.json 文件
-
{
-
"CN": "etcd",
-
"hosts": [
-
"127.0.0.1",
-
"10.120.200.2",
-
"10.120.200.3",
-
"10.120.200.10"
-
],
-
"key": {
-
"algo": "rsa",
-
"size": 2048
-
},
-
"names": [
-
{
-
"C": "CN",
-
"ST": "TJ",
-
"L": "TJ",
-
"O": "k8s",
-
"OU": "4Paradigm"
-
}
-
]
-
}
正在上传…重新上传取消
-
ansible k8s-master01.k8s.com -m copy -a "src=./etcd-csr.json dest=/opt/k8s/work"
-
ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work /opt/k8s/bin/cfssl gencert -ca=/opt/k8s/work/ca.pem \
-
-ca-key=/opt/k8s/work/ca-key.pem \
-
-config=/opt/k8s/work/ca-config.json \
-
-profile=kubernetes etcd-csr.json | /opt/k8s/bin/cfssljson -bare etcd"
-
ansible all -m shell -a "source /opt/k8s/bin/environment.sh"
-
for node_ip in ${ETCD_IPS[@]}; do echo ">>> ${node_ip}"; ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work scp ./etcd.pem root@${node_ip}:/etc/etcd/cert"; done
-
for node_ip in ${ETCD_IPS[@]}; do echo ">>> ${node_ip}"; ansible k8s-master01.k8s.com -m shell -a "chdir=/opt/k8s/work scp ./etcd-key.pem root@${node_ip}:/etc/etcd/cert"; done
3. 创建启动文件
生成etcd启动模板文件etcd.service.template
-
[Unit]
-
Description=Etcd Server
-
After=network.target
-
After=network-online.target
-
Wants=network-online.target
-
Documentation=https://github.com/coreos
-
[Service]
-
Type=notify
-
WorkingDirectory=/data/k8s/etcd/data
-
ExecStart=/opt/k8s/bin/etcd \
-
--data-dir=/data/k8s/etcd/data \
-
--wal-dir=/data/k8s/etcd/wal \
-
--name=##NODE_NAME## \
-
--cert-file=/etc/etcd/cert/etcd.pem \
-
--key-file=/etc/etcd/cert/etcd-key.pem \
-
--trusted-ca-file=/etc/kubernetes/cert/ca.pem \
-
--peer-cert-file=/etc/etcd/cert/etcd.pem \
-
--peer-key-file=/etc/etcd/cert/etcd-key.pem \
-
--peer-trusted-ca-file=/etc/kubernetes/cert/ca.pem \
-
--peer-client-cert-auth \
-
--client-cert-auth \
-
--listen-peer-urls=https://##NODE_IP##:2380 \
-
--initial-advertise-peer-urls=https://##NODE_IP##:2380 \
-
--listen-client-urls=https://##NODE_IP##:2379 \
-
--advertise-client-urls=https://##NODE_IP##:2379 \
-
--initial-cluster-token=etcd-cluster-0 \
-
--initial-cluster=k8s-master01=https://10.120.200.2:2380,k8s-master02=https://10.120.200.3:2380,k8s-node07=https://10.120.200.10:2380 \
-
--initial-cluster-state=new \
-
--auto-compaction-mode=periodic \
-
--auto-compaction-retention=1 \
-
--max-request-bytes=33554432 \
-
--quota-backend-bytes=6442450944 \
-
--heartbeat-interval=250 \
-
--election-timeout=2000
-
Restart=on-failure
-
RestartSec=5
-
LimitNOFILE=65536
-
[Install]
-
WantedBy=multi-user.target
正在上传…重新上传取消
生成节点启动文件
-
cd /opt/k8s/work
-
source /opt/k8s/bin/environment.sh
-
for (( i=0; i < 3; i++ ))
-
do
-
sed -e "s/##NODE_NAME##/${MASTER_NAMES[i]}/" -e "s/##NODE_IP##/${ETCD_IPS[i]}/" etcd.service.template > etcd-${ETCD_IPS[i]}.service
-
done
-
ls *.service
-
ansible k8s-master01.k8s.com -m copy -a "src=./etcd-10.120.200.2.service dest=/etc/systemd/system/etcd.service"
-
ansible k8s-master02.k8s.com -m copy -a "src=./etcd-10.120.200.3.service dest=/etc/systemd/system/etcd.service"
-
ansible k8s-node01.k8s.com -m copy -a "src=./etcd-10.120.200.10.service dest=/etc/systemd/system/etcd.service"
-
ansible etcd -m shell -a "mkdir /data/k8s/etcd/data/ -p"
-
ansible etcd -m shell -a "chmod 700 /data/k8s/etcd/data/ -R"[root@k8s-node-01 data]#
-
ansible etcd -m shell -a "mkdir -p ${ETCD_DATA_DIR} ${ETCD_WAL_DIR}"
-
ansible etcd -m shell -a "systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd"
正在上传…重新上传取消
检查结果
-
ansible etcd -m shell -a "systemctl status etcd|grep Active"
-
结果
-
k8s-node07.k8s.com | CHANGED | rc=0 >>
-
Active: active (running) since 三 2020-12-23 19:55:56 CST; 2h 5min ago
-
k8s-master01.k8s.com | CHANGED | rc=0 >>
-
Active: active (running) since 三 20