基于二进制部署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上执行

etcd.service

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上执行

猜你喜欢

转载自www.cnblogs.com/liang-io/p/10569988.html
今日推荐