前言:本篇博客是博主踩過無數坑,反覆查閱資料,一步步搭建完成後整理的個人心得,分享給大家~~~ 本文所需的安裝包,都上傳在我的網盤中,需要的可以打賞博主一杯咖啡錢,然後私密博主,博主會很快答覆呦~ 00.組件版本和配置策略 00-01.組件版本 Kubernetes 1.10.4 Docker 18 ...
前言:本篇博客是博主踩過無數坑,反覆查閱資料,一步步搭建完成後整理的個人心得,分享給大家~~~
本文所需的安裝包,都上傳在我的網盤中,需要的可以打賞博主一杯咖啡錢,然後私密博主,博主會很快答覆呦~
00.組件版本和配置策略
00-01.組件版本
- Kubernetes 1.10.4
- Docker 18.03.1-ce
- Etcd 3.3.7
- Flanneld 0.10.0
- 插件:
- Coredns
- Dashboard
- Heapster (influxdb、grafana)
- Metrics-Server
- EFK (elasticsearch、fluentd、kibana)
- 鏡像倉庫:
- docker registry
- harbor
00-02.主要配置策略
kube-apiserver:
- 使用 keepalived 和 haproxy 實現 3 節點高可用;
- 關閉非安全埠 8080 和匿名訪問;
- 在安全埠 6443 接收 https 請求;
- 嚴格的認證和授權策略 (x509、token、RBAC);
- 開啟 bootstrap token 認證,支持 kubelet TLS bootstrapping;
- 使用 https 訪問 kubelet、etcd,加密通信;
kube-controller-manager:
- 3 節點高可用;
- 關閉非安全埠,在安全埠 10252 接收 https 請求;
- 使用 kubeconfig 訪問 apiserver 的安全埠;
- 自動 approve kubelet 證書簽名請求 (CSR),證書過期後自動輪轉;
- 各 controller 使用自己的 ServiceAccount 訪問 apiserver;
kube-scheduler:
- 3 節點高可用;
- 使用 kubeconfig 訪問 apiserver 的安全埠;
kubelet:
- 使用 kubeadm 動態創建 bootstrap token,而不是在 apiserver 中靜態配置;
- 使用 TLS bootstrap 機制自動生成 client 和 server 證書,過期後自動輪轉;
- 在 KubeletConfiguration 類型的 JSON 文件配置主要參數;
- 關閉只讀埠,在安全埠 10250 接收 https 請求,對請求進行認證和授權,拒絕匿名訪問和非授權訪問;
- 使用 kubeconfig 訪問 apiserver 的安全埠;
kube-proxy:
- 使用 kubeconfig 訪問 apiserver 的安全埠;
- 在 KubeProxyConfiguration 類型的 JSON 文件配置主要參數;
- 使用 ipvs 代理模式;
集群插件:
- DNS:使用功能、性能更好的 coredns;
- Dashboard:支持登錄認證;
- Metric:heapster、metrics-server,使用 https 訪問 kubelet 安全埠;
- Log:Elasticsearch、Fluend、Kibana;
- Registry 鏡像庫:docker-registry、harbor;
01.系統初始化
01-01.集群機器
- kube-master:192.168.10.108
- kube-node1:192.168.10.109
- kube-node2:192.168.10.110
本文檔中的 etcd 集群、master 節點、worker 節點均使用這三台機器。
在每個伺服器上都要執行以下全部操作,如果沒有特殊指明,本文檔的所有操作均在kube-master 節點上執行
01-02.主機名
1、設置永久主機名稱,然後重新登錄
$ sudo hostnamectl set-hostname kube-master
$ sudo hostnamectl set-hostname kube-node1
$ sudo hostnamectl set-hostname kube-node2
2、修改 /etc/hostname 文件,添加主機名和 IP 的對應關係:
$ vim /etc/hosts
192.168.10.108 kube-master
192.168.10.109 kube-node1
192.168.10.110 kube-node2
01-03.添加 k8s 和 docker 賬戶
1、在每台機器上添加 k8s 賬戶
$ sudo useradd -m k8s
$ sudo sh -c 'echo along |passwd k8s --stdin' #為k8s 賬戶設置密碼
2、修改visudo許可權
$ sudo visudo #去掉%wheel ALL=(ALL) NOPASSWD: ALL這行的註釋
$ sudo grep '%wheel.*NOPASSWD: ALL' /etc/sudoers
%wheel ALL=(ALL) NOPASSWD: ALL
3、將k8s用戶歸到wheel組
$ gpasswd -a k8s wheel
Adding user k8s to group wheel
$ id k8s
uid=1000(k8s) gid=1000(k8s) groups=1000(k8s),10(wheel)
4、在每台機器上添加 docker 賬戶,將 k8s 賬戶添加到 docker 組中,同時配置 dockerd 參數(註:安裝完docker才有):
$ sudo useradd -m docker
$ sudo gpasswd -a k8s docker
$ sudo mkdir -p /opt/docker/
$ vim /opt/docker/daemon.json #可以後續部署docker時在操作
{
"registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"],
"max-concurrent-downloads": 20
}
01-04.無密碼 ssh 登錄其它節點
1、生成秘鑰對
[root@kube-master ~]# ssh-keygen #連續回車即可
2、將自己的公鑰發給其他伺服器
[root@kube-master ~]# ssh-copy-id root@kube-master
[root@kube-master ~]# ssh-copy-id root@kube-node1
[root@kube-master ~]# ssh-copy-id root@kube-node2
[root@kube-master ~]# ssh-copy-id k8s@kube-master
[root@kube-master ~]# ssh-copy-id k8s@kube-node1
[root@kube-master ~]# ssh-copy-id k8s@kube-node2
01-05.將可執行文件路徑 /opt/k8s/bin 添加到 PATH 變數
在每台機器上添加環境變數:
$ sudo sh -c "echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >> /etc/profile.d/k8s.sh"
$ source /etc/profile.d/k8s.sh
01-06.安裝依賴包
在每台機器上安裝依賴包:
CentOS:
$ sudo yum install -y epel-release
$ sudo yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
Ubuntu:
$ sudo apt-get install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
註:ipvs 依賴 ipset;
01-07.關閉防火牆
在每台機器上關閉防火牆:
① 關閉服務,並設為開機不自啟
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
② 清空防火牆規則
$ sudo iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat
$ sudo iptables -P FORWARD ACCEPT
01-08.關閉 swap 分區
1、如果開啟了 swap 分區,kubelet 會啟動失敗(可以通過將參數 --fail-swap-on 設置為false 來忽略 swap on),故需要在每台機器上關閉 swap 分區:
$ sudo swapoff -a
2、為了防止開機自動掛載 swap 分區,可以註釋 /etc/fstab 中相應的條目:
$ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
01-09.關閉 SELinux
1、關閉 SELinux,否則後續 K8S 掛載目錄時可能報錯 Permission denied :
$ sudo setenforce 0
2、修改配置文件,永久生效;
$ grep SELINUX /etc/selinux/config
SELINUX=disabled
01-10.關閉 dnsmasq (可選)
linux 系統開啟了 dnsmasq 後(如 GUI 環境),將系統 DNS Server 設置為 127.0.0.1,這會導致 docker 容器無法解析功能變數名稱,需要關閉它:
$ sudo service dnsmasq stop
$ sudo systemctl disable dnsmasq
01-11.載入內核模塊
$ sudo modprobe br_netfilter
$ sudo modprobe ip_vs
01-12.設置系統參數
$ 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 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_watches=89100 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720
EOF
$ sudo cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
$ sudo sysctl -p /etc/sysctl.d/kubernetes.conf
$ sudo mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct
註:
- tcp_tw_recycle 和 Kubernetes 的 NAT 衝突,必須關閉 ,否則會導致服務不通;
- 關閉不使用的 IPV6 協議棧,防止觸發 docker BUG;
01-13.設置系統時區
1、調整系統 TimeZone
$ sudo timedatectl set-timezone Asia/Shanghai
2、將當前的 UTC 時間寫入硬體時鐘
$ sudo timedatectl set-local-rtc 0
3、重啟依賴於系統時間的服務
$ sudo systemctl restart rsyslog
$ sudo systemctl restart crond
01-14.更新系統時間
$ yum -y install ntpdate
$ sudo ntpdate cn.pool.ntp.org
01-15.創建目錄
在每台機器上創建目錄:
$ sudo mkdir -p /opt/k8s/bin
$ sudo mkdir -p /opt/k8s/cert
$ sudo mkdir -p /opt/etcd/cert
$ sudo mkdir -p /opt/lib/etcd
$ sudo mkdir -p /opt/k8s/script
$ chown -R k8s /opt/*
01-16.檢查系統內核和模塊是否適合運行 docker (僅適用於linux 系統)
$ curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh
$ chmod +x check-config.sh
$ bash ./check-config.sh
02.創建 CA 證書和秘鑰
- 為確保全全, kubernetes 系統各組件需要使用 x509 證書對通信進行加密和認證。
- CA (Certificate Authority) 是自簽名的根證書,用來簽名後續創建的其它證書。
本文檔使用 CloudFlare 的 PKI 工具集 cfssl 創建所有證書。
02-01.安裝 cfssl 工具集
mkdir -p /opt/k8s/cert && sudo chown -R k8s /opt/k8s && cd /opt/k8s
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
mv cfssl_linux-amd64 /opt/k8s/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
mv cfssljson_linux-amd64 /opt/k8s/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /opt/k8s/bin/cfssl-certinfo
chmod +x /opt/k8s/bin/*
02-02.創建根證書 (CA)
CA 證書是集群所有節點共用的,只需要創建一個 CA 證書,後續創建的所有證書都由它簽名。
02-02-01 創建配置文件
CA 配置文件用於配置根證書的使用場景 (profile) 和具體參數 (usage,過期時間、服務端認證、客戶端認證、加密等),後續在簽名其它證書時需要指定特定場景。
[root@kube-master ~]# cd /opt/k8s/cert
[root@kube-master cert]# vim ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
註:
① signing :表示該證書可用於簽名其它證書,生成的 ca.pem 證書中CA=TRUE ;
② server auth :表示 client 可以用該該證書對 server 提供的證書進行驗證;
③ client auth :表示 server 可以用該該證書對 client 提供的證書進行驗證;
02-02-02 創建證書簽名請求文件
[root@kube-master cert]# vim ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "4Paradigm"
}
]
}
註:
① CN: Common Name ,kube-apiserver 從證書中提取該欄位作為請求的用戶名(User Name),瀏覽器使用該欄位驗證網站是否合法;
② O: Organization ,kube-apiserver 從證書中提取該欄位作為請求用戶所屬的組(Group);
③ kube-apiserver 將提取的 User、Group 作為 RBAC 授權的用戶標識;
02-02-03 生成 CA 證書和私鑰
[root@kube-master cert]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@kube-master cert]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
02-02-04 分發證書文件
將生成的 CA 證書、秘鑰文件、配置文件拷貝到所有節點的/opt/k8s/cert 目錄下:
[root@kube-master ~]# vim /opt/k8s/script/scp_k8scert.sh
NODE_IPS=("192.168.10.108" "192.168.10.109" "192.168.10.110") for node_ip in ${NODE_IPS[@]};do echo ">>> ${node_ip}" ssh root@${node_ip} "mkdir -p /opt/k8s/cert && chown -R k8s /opt/k8s" scp /opt/k8s/cert/ca*.pem /opt/k8s/cert/ca-config.json k8s@${node_ip}:/opt/k8s/cert done
[root@kube-master ~]# chmod +x /opt/k8s/script/scp_k8scert.sh && /opt/k8s/script/scp_k8scert.sh
03.部署 kubectl 命令行工具
kubectl 是 kubernetes 集群的命令行管理工具,本文檔介紹安裝和配置它的步驟。
kubectl 預設從 ~/.kube/config 文件讀取 kube-apiserver 地址、證書、用戶名等信息,如果沒有配置,執行 kubectl 命令時可能會出錯:
$ kubectl get pods
The connection to the server localhost:8080 was refused - did you specify the right host or port?
本文檔只需要部署一次,生成的 kubeconfig 文件與機器無關。
03-01.下載kubectl 二進位文件
下載和解壓
kubectl二進位文件需要科學上網下載,我已經下載到我的網盤,有需要的小伙伴聯繫我~
[root@kube-master ~]# wget https://dl.k8s.io/v1.10.4/kubernetes-client-linux-amd64.tar.gz
[root@kube-master ~]# tar -xzvf kubernetes-client-linux-amd64.tar.gz
03-02.創建 admin 證書和私鑰
- kubectl 與 apiserver https 安全埠通信,apiserver 對提供的證書進行認證和授權。
- kubectl 作為集群的管理工具,需要被授予最高許可權。這裡創建具有最高許可權的admin 證書。
03-02-01 創建證書簽名請求
[root@kube-master ~]# cd /opt/k8s/cert/
cat > admin-csr.json <<EOF
{ "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "system:masters", "OU": "4Paradigm" } ] }
註:
① O 為 system:masters ,kube-apiserver 收到該證書後將請求的 Group 設置為system:masters;
② 預定義的 ClusterRoleBinding cluster-admin 將 Group system:masters 與Role cluster-admin 綁定,該 Role 授予所有 API的許可權;
③ 該證書只會被 kubectl 當做 client 證書使用,所以 hosts 欄位為空;
03-02-02 生成證書和私鑰
[root@kube-master cert]# cfssl gencert -ca=/opt/k8s/cert/ca.pem \
-ca-key=/opt/k8s/cert/ca-key.pem \
-config=/opt/k8s/cert/ca-config.json \
-profile=kubernetes admin-csr.json | cfssljson_linux-amd64 -bare admin
[root@kube-master cert]# ls admin*
admin.csr admin-csr.json admin-key.pem admin.pem
03-03.創建和分發 kubeconfig 文件
03-03-01 創建kubeconfig文件
kubeconfig 為 kubectl 的配置文件,包含訪問 apiserver 的所有信息,如 apiserver 地址、CA 證書和自身使用的證書;
① 設置集群參數,(--server=${KUBE_APISERVER} ,指定IP和埠;我使用的是haproxy的VIP和埠;如果沒有haproxy代理,就用實際服務的IP和埠;如:https://192.168.10.108:6443)
[root@kube-master ~]# kubectl config set-cluster kubernetes \
--certificate-authority=/opt/k8s/cert/ca.pem \
--embed-certs=true \
--server=https://192.168.10.10:8443 \
--kubeconfig=/root/.kube/kubectl.kubeconfig
② 設置客戶端認證參數
[root@kube-master ~]# kubectl config set-credentials kube-admin \
--client-certificate=/opt/k8s/cert/admin.pem \
--client-key=/opt/k8s/cert/admin-key.pem \
--embed-certs=true \
--kubeconfig=/root/.kube/kubectl.kubeconfig
③ 設置上下文參數
[root@kube-master ~]# kubectl config set-context kube-admin@kubernetes \
--cluster=kubernetes \
--user=kube-admin \
--kubeconfig=/root/.kube/kubectl.kubeconfig
④ 設置預設上下文
[root@kube-master ~]# kubectl config use-context kube-admin@kubernetes --kubeconfig=/root/.kube/kubectl.kubeconfig
註:在後續kubernetes認證,文章中會詳細講解
- --certificate-authority :驗證 kube-apiserver 證書的根證書;
- --client-certificate 、 --client-key :剛生成的 admin 證書和私鑰,連接 kube-apiserver 時使用;
- --embed-certs=true :將 ca.pem 和 admin.pem 證書內容嵌入到生成的kubectl.kubeconfig 文件中(不加時,寫入的是證書文件路徑);
[root@kube-master ~]# chmod +x /opt/k8s/script/kubectl_environment.sh && /opt/k8s/script/kubectl_environment.sh
03-03-01 驗證kubeconfig文件
[root@kube-master ~]# ls /root/.kube/kubectl.kubeconfig
/root/.kube/kubectl.kubeconfig
[root@kube-master ~]# kubectl config view --kubeconfig=/root/.kube/kubectl.kubeconfig
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: REDACTED
server: https://192.168.10.10:8443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kube-admin
name: kube-admin@kubernetes
current-context: kube-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kube-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
03-03-03 分發 kubeclt 和kubeconfig 文件,分發到所有使用kubectl 命令的節點
[root@kube-master ~]# vim /opt/k8s/script/scp_kubectl.sh
NODE_IPS=("192.168.10.108" "192.168.10.109" "192.168.10.110")
NODE_IPS=("192.168.10.108" "192.168.10.109" "192.168.10.110") for node_ip in ${NODE_IPS[@]};do echo ">>> ${node_ip}" scp /root/kubernetes/client/bin/kubectl k8s@${node_ip}:/opt/k8s/bin/ ssh k8s@${node_ip} "chmod +x /opt/k8s/bin/*" ssh k8s@${node_ip} "mkdir -p ~/.kube" scp ~/.kube/config k8s@${node_ip}:~/.kube/config ssh root@${node_ip} "mkdir -p ~/.kube" scp ~/.kube/config root@${node_ip}:~/.kube/config done
[root@kube-master ~]# chmod +x /opt/k8s/script/scp_kubectl.sh && /opt/k8s/script/scp_kubectl.sh
04.部署 etcd 集群
etcd 是基於 Raft 的分散式 key-value 存儲系統,由 CoreOS 開發,常用於服務發現、共用配置以及併發控制(如 leader 選舉、分散式鎖等)。kubernetes 使用 etcd 存儲所有運行數據。
本文檔介紹部署一個三節點高可用 etcd 集群的步驟:
① 下載和分發 etcd 二進位文件
② 創建 etcd 集群各節點的 x509 證書,用於加密客戶端(如 etcdctl) 與 etcd 集群、etcd 集群之間的數據流;
③ 創建 etcd 的 systemd unit 文件,配置服務參數;
④ 檢查集群工作狀態;
04-01.下載etcd 二進位文件
到 https://github.com/coreos/etcd/releases 頁面下載最新版本的發佈包:
[root@kube-master ~]# https://github.com/coreos/etcd/releases/download/v3.3.7/etcd-v3.3.7-linux-amd64.tar.gz
[root@kube-master ~]# tar -xvf etcd-v3.3.7-linux-amd64.tar.gz
04-02.創建 etcd 證書和私鑰
04-02-01 創建證書簽名請求
[root@kube-master ~]# cd /opt/etcd/cert
[root@kube-master cert]# cat > etcd-csr.json <<EOF
{ "CN": "etcd", "hosts": [ "127.0.0.1", "192.168.10.108", "192.168.10.109", "192.168.10.110" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "4Paradigm" } ] }
EOF
註:hosts 欄位指定授權使用該證書的 etcd 節點 IP 或功能變數名稱列表,這裡將 etcd 集群的三個節點 IP 都列在其中;
04-02-02 生成證書和私鑰
[root@kube-master cert]# cfssl gencert -ca=/opt/k8s/cert/ca.pem \
-ca-key=/opt/k8s/cert/ca-key.pem \
-config=/opt/k8s/cert/ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson_linux-amd64 -bare etcd
[root@kube-master cert]# ls etcd*
etcd.csr etcd-csr.json etcd-key.pem etcd.pem
04-02-03 分發生成的證書和私鑰到各 etcd 節點
[root@kube-master ~]# vim /opt/k8s/script/scp_etcd.sh
NODE_IPS=("192.168.10.108" "192.168.10.109" "192.168.10.110")
for node_ip in ${NODE_IPS[@]};do echo ">>> ${node_ip}" scp /root/etcd-v3.3.7-linux-amd64/etcd* k8s@${node_ip}:/opt/k8s/bin ssh k8s@${node_ip} "chmod +x /opt/k8s/bin/*" ssh root@${node_ip} "mkdir -p /opt/etcd/cert && chown -R k8s /opt/etcd/cert" scp /opt/etcd/cert/etcd*.pem k8s@${node_ip}:/opt/etcd/cert/ done
04-03.創建etcd 的systemd unit 模板及etcd 配置文件
04-03-01 創建etcd 的systemd unit 模板
[root@kube-master ~]# cat > /opt/etcd/etcd.service.template <<EOF
[Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target Documentation=https://github.com/coreos [Service] User=k8s Type=notify WorkingDirectory=/opt/lib/etcd/ ExecStart=/opt/k8s/bin/etcd \ --data-dir=/opt/lib/etcd \ --name ##NODE_NAME## \ --cert-file=/opt/etcd/cert/etcd.pem \ --key-file=/opt/etcd/cert/etcd-key.pem \ --trusted-ca-file=/opt/k8s/cert/ca.pem \ --peer-cert-file=/opt/etcd/cert/etcd.pem \ --peer-key-file=/opt/etcd/cert/etcd-key.pem \ --peer-trusted-ca-file=/opt/k8s/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,http://127.0.0.1:2379\ --advertise-client-urls=https://##NODE_IP##:2379 \ --initial-cluster-token=etcd-cluster-0 \ --initial-cluster=etcd0=https://192.168.10.108:2380,etcd1=https://192.168.10.109:2380,etcd2=https://192.168.10.110:2380 \ --initial-cluster-state=new Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
EOF
註:
- User :指定以 k8s 賬戶運行;
- WorkingDirectory 、 --data-dir :指定工作目錄和數據目錄為/opt/lib/etcd ,需在啟動服務前創建這個目錄;
- --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 證書;
04-04.為各節點創建和分發 etcd systemd unit 文件
[root@kube-master ~]# cd /opt/k8s/script
[root@kube-master script]# vim etcd_service.sh
NODE_NAMES=("etcd0" "etcd1" "etcd2") NODE_IPS=("192.168.10.108" "192.168.10.109" "192.168.10.110") #替換模板文件中的變數,為各節點創建 systemd unit 文件 for (( i=0; i < 3; i++ ));do sed -e "s/##NODE_NAME##/${NODE_NAMES[i]}/g" -e "s/##NODE_IP##/${NODE_IPS[i]}/g" /opt/etcd/etcd.service.template > /opt/etcd/etcd-${NODE_IPS[i]}.service done #分發生成的 systemd unit 和etcd的配置文件: for node_ip in ${NODE_IPS[@]};do echo ">>> ${node_ip}" ssh root@${node_ip} "mkdir -p /opt/lib/etcd && chown -R k8s /opt/lib/etcd" scp /opt/etcd/etcd-${node_ip}.service root@${node_ip}:/etc/systemd/system/etcd.service done
[root@kube-master script]# chmod +x /opt/k8s/script/etcd_service.sh &&