基于二进制部署Kubernetes v1.13.4(学习记录)
1.1 什么是kubernetes
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。通过
Kubernetes你可以:
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
注:K8s是将Kubernetes的8个字母“ubernete”替换为“8”的缩写。
1.2 kubernetes的特点
- 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
- 可扩展: 模块化, 插件化, 可挂载, 可组合
- 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
1.3 kubernetes能做什么
- 多个进程(作为容器运行)协同工作。(Pod)
- 存储系统挂载
- 分发敏感文件
- 应用健康检测
- 应用实例的复制
- Pod自动伸缩/扩展
- 务发现
- 负载均衡
- 滚动更新
- 资源监控
- 日志访问
- 调试应用程序
- 提供认证和授权
1.4 kubernetes核心组件
Kubernetes主要由以下几个核心组件组成:
- etcd:保存了整个集群的状态;
- apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
- kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI);
- kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡;
除了核心组件,还有一些推荐的Add-ons:
- kube-dns:负责为整个集群提供DNS服务
- Ingress Controller:为服务提供外网入口
- Heapster:提供资源监控
- Dashboard:提供GUI
- Federation:集群联邦提供跨可用区的集群
- Fluentd-elasticsearch:提供集群日志采集、存储与查询
1.5 kubernetes二进制安装包下载
安装包下载地址: https://github.com/kubernetes/kubernetes
需要下载的安装包如下图:
2. kubernetes基础环境部署
2.1 kubernetes部署节点环境说明
主机名 | IP Address | service |
---|---|---|
ks-master | 10.10.11.21 | docker、etcd、api-server、scheduler、controller-manager、kubelet、flannel |
ks-node1 | 10.10.11.20 | docker、etcd、kubelet、proxy、flannel |
ks-node2 | 10.10.11.19 | docker、etcd、kubelet、proxy、flannel |
master节点
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就是负责后台的。每一个资源都对应一个控制器。而control manager就是负责管理这些控制器的,比如我们通过APIServer创建了一个Pod,当这个Pod创建成功后,APIServer的任务就算完成了。
etcd:etcd是一个高可用的键值存储系统,kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。
node节点
每个Node节点主要由三个模板组成:kublet, kube-proxy
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的运行状态与期望的状态一致。
2.2 kubernetes部署前准备
配置所有节点主机名
1 # 配置主机名 2 [root@ks-master ~]# hostnamectl set-hostname ks-master 3 [root@ks-node1 ~]# hostnamectl set-hostname ks-node1 4 [root@ks-node2 ~]# hostnamectl set-hostname ks-node2
1 # 配置hosts记录 2 3 cat <<EOF > /etc/hosts 4 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 5 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 6 10.10.11.21 ks-master 7 10.10.11.20 ks-node1 8 10.10.11.19 ks-node2 9 EOF 10 11 # 配置免密钥登陆 12 13 [root@ks-master ~]# ssh-keygen 14 Generating public/private rsa key pair. 15 Enter file in which to save the key (/root/.ssh/id_rsa): 16 Enter passphrase (empty for no passphrase): 17 Enter same passphrase again: 18 Your identification has been saved in /root/.ssh/id_rsa. 19 Your public key has been saved in /root/.ssh/id_rsa.pub. 20 The key fingerprint is: 21 SHA256:fIPG7HsiNiDfQ3e0eITt4tB9mR6JcHNF0di90R1F9rc root@ks-master 22 The key's randomart image is: 23 +---[RSA 2048]----+ 24 | .oBX| 25 | ooB| 26 | o . =| 27 | +o.* . .o| 28 | .SOo= + E | 29 | . . oo=.B.* | 30 | o + +.+ o . | 31 | . * o.. . | 32 | . +.o | 33 +----[SHA256]-----+ 34 35 [root@ks-master ~]# ssh-copy-id ks-master 36 [root@ks-master ~]# ssh-copy-id ks-node1 37 [root@ks-master ~]# ssh-copy-id ks-node2
2.3 kubernetes节点系统优化
1 # 关闭防火墙 2 systemctl stop firewalld 3 systemctl disable firewalld 4 5 # 关闭Swap 6 swapoff -a 7 sed -i 's/.*swap.*/#&/' /etc/fstab 8 9 # 禁用Selinux 10 setenforce 0 11 sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux 12 sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config 13 sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux 14 sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config 15 16 # 报错请参考下面报错处理 17 modprobe br_netfilter 18 cat <<EOF > /etc/sysctl.d/k8s.conf 19 net.bridge.bridge-nf-call-ip6tables = 1 20 net.bridge.bridge-nf-call-iptables = 1 21 net.ipv4.ip_forward = 1 22 vm.swappiness=0 23 EOF 24 sysctl -p /etc/sysctl.d/k8s.conf 25 ls /proc/sys/net/bridge 26 27 # 内核优化 28 echo "* soft nofile 204800" >> /etc/security/limits.conf 29 echo "* hard nofile 204800" >> /etc/security/limits.conf 30 echo "* soft nproc 204800" >> /etc/security/limits.conf 31 echo "* hard nproc 204800" >> /etc/security/limits.conf 32 echo "* soft memlock unlimited" >> /etc/security/limits.conf 33 echo "* hard memlock unlimited" >> /etc/security/limits.conf
注:kubernetes所有节点执行
2.4 安装Docker-CE
1 yum install -y yum-utils device-mapper-persistent-data lvm2 2 yum-config-manager \ 3 --add-repo \ 4 https://download.docker.com/linux/centos/docker-ce.repo 5 6 yum makecache fast 7 yum install -y --setopt=obsoletes=0 \ 8 docker-ce-18.06.1.ce-3.el7 9 10 systemctl start docker 11 systemctl enable docker
注:kubernetes所有节点执行
2.5 配置Docker镜像加速
1 sudo mkdir -p /etc/docker 2 sudo tee /etc/docker/daemon.json <<-'EOF' 3 { 4 "registry-mirrors": ["https://95d2qlt5.mirror.aliyuncs.com"] 5 } 6 EOF 7 sudo systemctl daemon-reload 8 sudo systemctl restart docker
3. 创建 CA 证书和秘钥
为确保安全,kubernetes 系统各组件需要使用 x509 证书对通信进行加密和认证。
CA (Certificate Authority) 是自签名的根证书,用来签名后续创建的其它证书。
3.1 安装 cfssl 工具集
1 sudo mkdir -p /opt/k8s/cert && cd /opt/k8s 2 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 3 mv cfssl_linux-amd64 /opt/k8s/bin/cfssl 4 5 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 6 mv cfssljson_linux-amd64 /opt/k8s/bin/cfssljson 7 8 wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 9 mv cfssl-certinfo_linux-amd64 /opt/k8s/bin/cfssl-certinfo 10 11 chmod +x /opt/k8s/bin/* 12 export PATH=/opt/k8s/bin:$PATH
注:所有操作在ks-master上执行
3.2 创建根证书 (CA)
CA 证书是集群所有节点共享的,只需要创建一个 CA 证书,后续创建的所有证书都由它签名。
创建配置文件
CA 配置文件用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等),后续在签名其它证书时需要指定特定场景。
1 cd /opt/k8s/work 2 cat > ca-config.json <<EOF 3 { 4 "signing": { 5 "default": { 6 "expiry": "87600h" 7 }, 8 "profiles": { 9 "kubernetes": { 10 "usages": [ 11 "signing", 12 "key encipherment", 13 "server auth", 14 "client auth" 15 ], 16 "expiry": "87600h" 17 } 18 } 19 } 20 } 21 EOF
注:所有操作在ks-master上执行
- signing:表示该证书可用于签名其它证书,生成的 ca.pem 证书中 CA=TRUE;
- server auth:表示 client 可以用该该证书对 server 提供的证书进行验证;
- client auth:表示 server 可以用该该证书对 client 提供的证书进行验证;
创建证书签名请求文件
1 cd /opt/k8s/work 2 cat > ca-csr.json <<EOF 3 { 4 "CN": "kubernetes", 5 "key": { 6 "algo": "rsa", 7 "size": 2048 8 }, 9 "names": [ 10 { 11 "C": "CN", 12 "ST": "BeiJing", 13 "L": "BeiJing", 14 "O": "k8s", 15 "OU": "4Paradigm" 16 } 17 ] 18 } 19 EOF
注:所有操作在ks-master上执行
- CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name),浏览器使用该字段验证网站是否合法;
- O:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
- kube-apiserver 将提取的 User、Group 作为 RBAC 授权的用户标识;
3.3 生成 CA 证书和私钥
1 cd /opt/k8s/work 2 cfssl gencert -initca ca-csr.json | cfssljson -bare ca 3 ls ca*
注:所有操作在ks-master上执行
3.4 分发证书文件
将生成的 CA 证书、秘钥文件、配置文件拷贝到所有节点的 /etc/kubernetes/cert 目录下:
首先执行此脚本加载变量:environment.sh
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh # 导入 NODE_IPS 环境变量 3 for node_ip in ${NODE_IPS[@]} 4 do 5 echo ">>> ${node_ip}" 6 ssh root@${node_ip} "mkdir -p /etc/kubernetes/cert" 7 scp ca*.pem ca-config.json root@${node_ip}:/etc/kubernetes/cert 8 done
注:所有操作在ks-master上执行
4. 部署 kubectl 客户端工具
kubectl 是 kubernetes 集群的命令行管理工具,kubectl 默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息,如果没有配置,执行 kubectl 命令时可能会出错:
1 [root@ks-master bin]# kubectl get pods 2 The connection to the server 127.0.0.1:8443 was refused - did you specify the right host or port?
4.1 下载和分发 kubectl 二进制文件
1 cd /opt/k8s/work 2 wget https://dl.k8s.io/v1.13.4/kubernetes-client-linux-amd64.tar.gz 3 tar -xzvf kubernetes-client-linux-amd64.tar.gz 4 5 # 分发到所有使用 kubectl 的节点: 6 7 cd /opt/k8s/work 8 source /opt/k8s/bin/environment.sh 9 for node_ip in ${NODE_IPS[@]} 10 do 11 echo ">>> ${node_ip}" 12 scp kubernetes/client/bin/kubectl root@${node_ip}:/opt/k8s/bin/ 13 ssh root@${node_ip} "chmod +x /opt/k8s/bin/*" 14 done
注:所有操作在ks-master上执行
4.2 创建 admin 证书和私钥
kubectl 与 apiserver https 安全端口通信,apiserver 对提供的证书进行认证和授权。
kubectl 作为集群的管理工具,需要被授予最高权限。这里创建具有最高权限的 admin 证书。
创建证书签名请求:
1 cd /opt/k8s/work 2 cat > admin-csr.json <<EOF 3 { 4 "CN": "admin", 5 "hosts": [], 6 "key": { 7 "algo": "rsa", 8 "size": 2048 9 }, 10 "names": [ 11 { 12 "C": "CN", 13 "ST": "BeiJing", 14 "L": "BeiJing", 15 "O": "system:masters", 16 "OU": "4Paradigm" 17 } 18 ] 19 } 20 EOF
注:所有操作在ks-master上执行
- O 为 system:masters,kube-apiserver 收到该证书后将请求的 Group 设置为 system:masters;
- 预定义的 ClusterRoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予所有 API的权限;
- 该证书只会被 kubectl 当做 client 证书使用,所以 hosts 字段为空;
生成证书和私钥:
1 cd /opt/k8s/work 2 cfssl gencert -ca=/opt/k8s/work/ca.pem \ 3 -ca-key=/opt/k8s/work/ca-key.pem \ 4 -config=/opt/k8s/work/ca-config.json \ 5 -profile=kubernetes admin-csr.json | cfssljson -bare admin 6 7 ls admin*
注:所有操作在ks-master上执行
4.3 创建 kubeconfig 文件
kubeconfig 为 kubectl 的配置文件,包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书;
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh 3 4 # 设置集群参数 5 kubectl config set-cluster kubernetes \ 6 --certificate-authority=/opt/k8s/work/ca.pem \ 7 --embed-certs=true \ 8 --server=${KUBE_APISERVER} \ 9 --kubeconfig=kubectl.kubeconfig 10 11 # 设置客户端认证参数 12 kubectl config set-credentials admin \ 13 --client-certificate=/opt/k8s/work/admin.pem \ 14 --client-key=/opt/k8s/work/admin-key.pem \ 15 --embed-certs=true \ 16 --kubeconfig=kubectl.kubeconfig 17 18 # 设置上下文参数 19 kubectl config set-context kubernetes \ 20 --cluster=kubernetes \ 21 --user=admin \ 22 --kubeconfig=kubectl.kubeconfig 23 24 # 设置默认上下文 25 kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig
- –certificate-authority:验证 kube-apiserver 证书的根证书;
- –client-certificate、–client-key:刚生成的 admin 证书和私钥,连接 kube-apiserver 时使用;
- –embed-certs=true:将 ca.pem 和 admin.pem 证书内容嵌入到生成的 kubectl.kubeconfig 文件中(不加时,写入的是证书文件路径);
注:所有操作在ks-master上执行
4.4 分发 kubeconfig 文件
分发到所有使用 kubectl 命令的节点:
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh 3 for node_ip in ${NODE_IPS[@]} 4 do 5 echo ">>> ${node_ip}" 6 ssh root@${node_ip} "mkdir -p ~/.kube" 7 scp kubectl.kubeconfig root@${node_ip}:~/.kube/config 8 done
注:所有操作在ks-master上执行
5. 部署 etcd 高可用集群
etcd 是基于 Raft 的分布式 key-value 存储系统,由 CoreOS 开发,常用于服务发现、共享配置以及并发控制(如 leader 选举、分布式锁等)。kubernetes 使用 etcd 存储所有运行数据。
etcd 集群各节点的名称和 IP 如下:
- ks-master:10.10.11.21
- ks-node1:10.10.11.20
- ks-node2:10.10.11.19
注:所有操作在ks-master上执行
5.1 下载和分发 etcd 二进制文件
1 cd /opt/k8s/work 2 wget https://github.com/coreos/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz 3 tar -xvf etcd-v3.3.10-linux-amd64.tar.gz 4 5 # 分发二进制文件到集群所有节点 6 7 cd /opt/k8s/work 8 source /opt/k8s/bin/environment.sh 9 for node_ip in ${NODE_IPS[@]} 10 do 11 echo ">>> ${node_ip}" 12 scp etcd-v3.3.10-linux-amd64/etcd* root@${node_ip}:/opt/k8s/bin 13 ssh root@${node_ip} "chmod +x /opt/k8s/bin/*" 14 done
注:所有操作在ks-master上执行
5.2 创建 etcd 证书和私钥
创建证书签名请求:
1 cat > etcd-csr.json <<EOF 2 { 3 "CN": "etcd", 4 "hosts": [ 5 "127.0.0.1", 6 "10.10.11.21", 7 "10.10.11.20", 8 "10.10.11.19" 9 ], 10 "key": { 11 "algo": "rsa", 12 "size": 2048 13 }, 14 "names": [ 15 { 16 "C": "CN", 17 "ST": "BeiJing", 18 "L": "BeiJing", 19 "O": "k8s", 20 "OU": "4Paradigm" 21 } 22 ] 23 } 24 EOF
注:所有操作在ks-master上执行
- hosts 字段指定授权使用该证书的 etcd 节点 IP 或域名列表,这里将 etcd 集群的三个节点 IP 都列在其中;
生成证书和私钥:
1 cd /opt/k8s/work 2 cfssl gencert -ca=/opt/k8s/work/ca.pem \ 3 -ca-key=/opt/k8s/work/ca-key.pem \ 4 -config=/opt/k8s/work/ca-config.json \ 5 -profile=kubernetes etcd-csr.json | cfssljson -bare etcd 6 ls etcd*pem
注:所有操作在ks-master上执行
分发生成的证书和私钥到各 etcd 节点:
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh 3 for node_ip in ${NODE_IPS[@]} 4 do 5 echo ">>> ${node_ip}" 6 ssh root@${node_ip} "mkdir -p /etc/etcd/cert" 7 scp etcd*.pem root@${node_ip}:/etc/etcd/cert/ 8 done
注:所有操作在ks-master上执行
5.3 创建 etcd 的 systemd unit 模板文件
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh 3 cat > etcd.service.template <<EOF 4 [Unit] 5 Description=Etcd Server 6 After=network.target 7 After=network-online.target 8 Wants=network-online.target 9 Documentation=https://github.com/coreos 10 11 [Service] 12 Type=notify 13 WorkingDirectory=${ETCD_DATA_DIR} 14 ExecStart=/opt/k8s/bin/etcd \\ 15 --data-dir=${ETCD_DATA_DIR} \\ 16 --wal-dir=${ETCD_WAL_DIR} \\ 17 --name=##NODE_NAME## \\ 18 --cert-file=/etc/etcd/cert/etcd.pem \\ 19 --key-file=/etc/etcd/cert/etcd-key.pem \\ 20 --trusted-ca-file=/etc/kubernetes/cert/ca.pem \\ 21 --peer-cert-file=/etc/etcd/cert/etcd.pem \\ 22 --peer-key-file=/etc/etcd/cert/etcd-key.pem \\ 23 --peer-trusted-ca-file=/etc/kubernetes/cert/ca.pem \\ 24 --peer-client-cert-auth \\ 25 --client-cert-auth \\ 26 --listen-peer-urls=https://##NODE_IP##:2380 \\ 27 --initial-advertise-peer-urls=https://##NODE_IP##:2380 \\ 28 --listen-client-urls=https://##NODE_IP##:2379,http://127.0.0.1:2379 \\ 29 --advertise-client-urls=https://##NODE_IP##:2379 \\ 30 --initial-cluster-token=etcd-cluster-0 \\ 31 --initial-cluster=${ETCD_NODES} \\ 32 --initial-cluster-state=new \\ 33 --auto-compaction-mode=periodic \\ 34 --auto-compaction-retention=1 \\ 35 --max-request-bytes=33554432 \\ 36 --quota-backend-bytes=6442450944 \\ 37 --heartbeat-interval=250 \\ 38 --election-timeout=2000 39 Restart=on-failure 40 RestartSec=5 41 LimitNOFILE=65536 42 43 [Install] 44 WantedBy=multi-user.target 45 EOF
注:所有操作在ks-master上执行
- WorkingDirectory、–data-dir:指定工作目录和数据目录为 ${ETCD_DATA_DIR},需在启动服务前创建这个目录;
- –wal-dir:指定 wal 目录,为了提高性能,一般使用 SSD 或者和 –data-dir 不同的磁盘;
- –name:指定节点名称,当 –initial-cluster-state 值为 new 时,–name 的参数值必须位于 –initial-cluster 列表中;
- –cert-file、–key-file:etcd server 与 client 通信时使用的证书和私钥;
- –trusted-ca-file:签名 client 证书的 CA 证书,用于验证 client 证书;
- –peer-cert-file、–peer-key-file:etcd 与 peer 通信使用的证书和私钥;
- –peer-trusted-ca-file:签名 peer 证书的 CA 证书,用于验证 peer 证书;
5.4 为各节点创建和分发 etcd systemd unit 文件
替换模板文件中的变量,为各节点创建 systemd unit 文件:
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh 3 for (( i=0; i < 3; i++ )) 4 do 5 sed -e "s/##NODE_NAME##/${NODE_NAMES[i]}/" -e "s/##NODE_IP##/${NODE_IPS[i]}/" etcd.service.template > etcd-${NODE_IPS[i]}.service 6 done 7 ls *.service
注:所有操作在ks-master上执行
- NODE_NAMES 和 NODE_IPS 为相同长度的 bash 数组,分别为节点名称和对应的 IP;
分发生成的 systemd unit 文件:
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh 3 for node_ip in ${NODE_IPS[@]} 4 do 5 echo ">>> ${node_ip}" 6 scp etcd-${node_ip}.service root@${node_ip}:/etc/systemd/system/etcd.service 7 done
注:所有操作在ks-master上执行
5.5 启动 etcd 服务
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh 3 for node_ip in ${NODE_IPS[@]} 4 do 5 echo ">>> ${node_ip}" 6 ssh root@${node_ip} "mkdir -p ${ETCD_DATA_DIR} ${ETCD_WAL_DIR}" 7 ssh root@${node_ip} "systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd " & 8 done
注:所有操作在ks-master上执行
- 必须创建 etcd 数据目录和工作目录;
- etcd 进程首次启动时会等待其它节点的 etcd 加入集群,命令 systemctl start etcd 会卡住一段时间,为正常现象。
5.6 检查启动结果
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh 3 for node_ip in ${NODE_IPS[@]} 4 do 5 echo ">>> ${node_ip}" 6 ssh root@${node_ip} "systemctl status etcd|grep Active" 7 done 8 9 # 执行结果 10 >>> 10.10.11.21 11 Active: active (running) since Tue 2019-03-19 15:55:22 CST; 1h 26min ago 12 >>> 10.10.11.20 13 Active: active (running) since Tue 2019-03-19 15:55:11 CST; 1h 26min ago 14 >>> 10.10.11.19 15 Active: active (running) since Tue 2019-03-19 15:55:11 CST; 1h 26min ago
注:所有操作在ks-master上执行
5.7 验证服务状态
部署完 etcd 集群后,在任一 etc 节点上执行如下命令:
1 cd /opt/k8s/work 2 source /opt/k8s/bin/environment.sh 3 for node_ip in ${NODE_IPS[@]} 4 do 5 echo ">>> ${node_ip}" 6 ETCDCTL_API=3 /opt/k8s/bin/etcdctl \ 7 --endpoints=https://${node_ip}:2379 \ 8 --cacert=/opt/k8s/work/ca.pem \ 9 --cert=/etc/etcd/cert/etcd.pem \ 10 --key=/etc/etcd/cert/etcd-key.pem endpoint health 11 done 12 13 # 执行结果 14 15 >>> 10.10.11.21 16 https://10.10.11.21:2379 is healthy: successfully committed proposal: took = 1.997671ms 17 >>> 10.10.11.20 18 https://10.10.11.20:2379 is healthy: successfully committed proposal: took = 1.289626ms 19 >>> 10.10.11.19 20 https://10.10.11.19:2379 is healthy: successfully committed proposal: took = 1.663937ms
注:所有操作在ks-master上执行
5.8 查看当前的 leader
1 source /opt/k8s/bin/environment.sh 2 ETCDCTL_API=3 /opt/k8s/bin/etcdctl \ 3 -w table --cacert=/opt/k8s/work/ca.pem \ 4 --cert=/etc/etcd/cert/etcd.pem \ 5 --key=/etc/etcd/cert/etcd-key.pem \ 6 --endpoints=${ETCD_ENDPOINTS} endpoint status 7 8 # 结果 9 10 +--------------------------+------------------+---------+---------+-----------+-----------+------------+ 11 | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX | 12 +--------------------------+------------------+---------+---------+-----------+-----------+------------+ 13 | https://10.10.11.21:2379 | a5819d9a1318a6fd | 3.3.10 | 20 kB | false | 5 | 15 | 14 | https://10.10.11.20:2379 | 41f7138582b5f2c2 | 3.3.10 | 20 kB | true | 5 | 15 | 15 | https://10.10.11.19:2379 | 97f11d52a9bffebb | 3.3.10 | 20 kB | false | 5 | 15 | 16 +--------------------------+------------------+---------+---------+-----------+-----------+------------+
注:IS LEADER 为true,则为leader
注:所有操作在ks-master上执行