二進位安裝部署kubernetes集群---超詳細教程

来源:https://www.cnblogs.com/along21/archive/2018/12/03/10044931.html
-Advertisement-
Play Games

前言:本篇博客是博主踩過無數坑,反覆查閱資料,一步步搭建完成後整理的個人心得,分享給大家~~~ 本文所需的安裝包,都上傳在我的網盤中,需要的可以打賞博主一杯咖啡錢,然後私密博主,博主會很快答覆呦~ 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 (influxdbgrafana)
    • Metrics-Server
    • EFK (elasticsearchfluentdkibana)
  • 鏡像倉庫:
    • docker registry
    • harbor

 

00-02.主要配置策略

kube-apiserver

  • 使用 keepalived haproxy 實現 3 節點高可用;
  • 關閉非安全埠 8080 和匿名訪問;
  • 在安全埠 6443 接收 https 請求;
  • 嚴格的認證和授權策略 (x509tokenRBAC)
  • 開啟 bootstrap token 認證,支持 kubelet TLS bootstrapping
  • 使用 https 訪問 kubeletetcd,加密通信;

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:支持登錄認證;
  • Metricheapstermetrics-server,使用 https 訪問 kubelet 安全埠;
  • LogElasticsearchFluendKibana
  • Registry 鏡像庫:docker-registryharbor

 

01.系統初始化

01-01.集群機器

  • kube-master192.168.10.108
  • kube-node1192.168.10.109
  • kube-node2192.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"
        }
    ]
}

註:

① CNCommon Name kube-apiserver 從證書中提取該欄位作為請求的用戶名(User Name),瀏覽器使用該欄位驗證網站是否合法;

② OOrganization kube-apiserver 從證書中提取該欄位作為請求用戶所屬的組(Group)

③ kube-apiserver 將提取的 UserGroup 作為 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和埠;我使用的是haproxyVIP和埠;如果沒有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 &&

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.打開任務管理器切換到啟動Tab,在需要刪除的項目上點擊右鍵,點擊打開文件所在位置,這樣就找到了啟動項所在磁碟位置,可以根據需要決定是否刪除。 2.從註冊表中刪除在啟動中的註冊信息。 regedit 打開註冊表後,將註冊表定位於 \HKEY_LOCAL_MACHINE\SOFTWARE\Wow64 ...
  • 最近瀏覽博客的時候,經常會看到博主展示出自己的公鑰,於是對 GPG/PGP 產生興趣。下麵簡單記錄相關文章的鏈接,方便以後瞭解。 簡介: 1991年,程式員Phil Zimmermann為了避開政府的監視,開發了加密軟體PGP。因為這個軟體非常好用,迅速流傳開來成為許多程式員的必備工具。但是,它是商 ...
  • 1、定義方式:在[]內用逗號分隔開多個任意類型的值l l=['a','b','c'] l=list(['a','b','c']) ​ 類型轉換 l=list('hello') l=list({'x':1,'y':2}) print(l) ​ 2,常用操作+內置的方法 同字元串相似 ​ (1),追加& ...
  • 1. Method 請求方法,表明客戶端希望伺服器對資源執行的動作; 1.1 GET 向伺服器請求資源。 1.2 HEAD 和GET方法的行為類似,但伺服器在響應中只返迴首部,不會返回實體的主體部分。這就允許客戶端在未獲取實際資源的情況下,對資源的首部進行檢查。 可以做到: 不獲取資源的情況下瞭解資 ...
  • 【通用命令】 1.創建文件夾 mkdir -p xxx 2.解壓包 tar -zxvf xxxx.tar.gz 3.縮文件 tar zcvf 壓縮包名稱.tar.gz 要壓縮的文件 4.動命令 mv 文件 移動到的位置 5添加服務 chkconfig --ad 6賦權 chmod -R 777 xx ...
  • 忘記root密碼 如果不小心忘記了root密碼,那麼mysql就不能再登錄了,這時就要重置root密碼才行。通過下麵的步驟,我們可以重新設置root密碼。 1、退出mysql [root@localhost src]# service mysqld stop 停止mysqld: [確定] [root ...
  • 1. 啟動過程中的記憶體初始化 首先我們來看看start_kernel是如何初始化系統的, start_kerne定義在 "init/main.c?v=4.7, line 479" 其代碼很複雜, 我們只截取出其中與記憶體管理初始化相關的部分, 如下所示 table th:nth of type(1){ ...
  • diff 命令是 linux上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中列印每一個行的改動。最新版本的diff還支持二進位文件。diff程式的輸出被稱為補丁 (patch),因為Linux系統中還有一個patch程式,可以根據diff的輸出將 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...