国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分

這篇具有很好參考價(jià)值的文章主要介紹了[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 常見(jiàn)的K8S安裝部署方式

1.1 Minikube

Minikube是一個(gè)工具,可以在本地快速運(yùn)行一個(gè)單節(jié)點(diǎn)微型K8S,僅用于學(xué)習(xí)、預(yù)覽K8S的一些特性使用。

部署地址:https://kubernetes.io/docs/setup/minikube

1.2 Kubeadm

Kubeadm也是一個(gè)工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相對(duì)簡(jiǎn)單。

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

1.3 二進(jìn)制安裝部署

生產(chǎn)首選,從官方下載發(fā)行版的二進(jìn)制包,手動(dòng)部署每個(gè)組件和自簽TLS證書(shū),組成K8S集群,新手推薦。

https://github.com/kubernetes/kubernetes/releases

2. Kubernetes單master集群架構(gòu) ---- (二進(jìn)制安裝部署)

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

2.1 前置準(zhǔn)備

master01 192.168.67.102

node01   192.168.67.103
node02   192.168.67.104

2.2 操作系統(tǒng)初始化

#關(guān)閉防火墻
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

#關(guān)閉selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

#關(guān)閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 

#根據(jù)規(guī)劃設(shè)置主機(jī)名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02

#添加hosts
cat >> /etc/hosts << EOF
192.168.67.102 master01
192.168.67.103 node01
192.168.67.104 node02
EOF

#調(diào)整內(nèi)核參數(shù)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1 
EOF

sysctl --system
#全局加載

yum install ntpdate -y
ntpdate time.windows.com
#與windows進(jìn)行時(shí)間同步

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)
[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)
[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

2.3 部署 docker引擎 ---- (所有 node 節(jié)點(diǎn))

yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum install -y docker-ce docker-ce-cli containerd.io

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)
[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#創(chuàng)建配置文件
mkdir /etc/docker

vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://r5uulkvq.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
  "max-size": "500m", "max-file": "3"
  }
}

使用Systemd管理的Cgroup來(lái)進(jìn)行資源控制與管理,因?yàn)橄鄬?duì)Cgroupfs而言,Systemd限制CPU、內(nèi)存等資源更加簡(jiǎn)單和成熟穩(wěn)定。
#日志使用json-file格式類型存儲(chǔ),大小為100M,保存在/var/log/containers目錄下,方便ELK等日志系統(tǒng)收集和管理日志。
systemctl start docker.service
systemctl enable docker.service 

2.4 部署 etcd 集群

  1. 使用cfssl工具簽發(fā)證書(shū)和私鑰
  2. 解壓etcd軟件包,獲取二進(jìn)制文件 etcd etcdctl
  3. 準(zhǔn)備etcd集群配置文件
  4. 啟動(dòng)etcd服務(wù)進(jìn)程,加入到etcd集群

2.4.1 etcd的特點(diǎn)

etcd 作為服務(wù)發(fā)現(xiàn)系統(tǒng),有以下的特點(diǎn):

  • 簡(jiǎn)單:安裝配置簡(jiǎn)單,而且提供了HTTP API進(jìn)行交互,使用也很簡(jiǎn)單
  • 安全:支持SSL證書(shū)驗(yàn)證
  • 快速:?jiǎn)螌?shí)例支持每秒2k+讀操作
  • 可靠:采用raft算法,實(shí)現(xiàn)分布式系統(tǒng)數(shù)據(jù)的可用性和一致性
etcd 目前默認(rèn)使用2379端口提供HTTP API服務(wù), 2380端口和peer通信(這兩個(gè)端口已經(jīng)被IANA(互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))官方預(yù)留給etcd)。 即etcd默認(rèn)使用2379端口對(duì)外為客戶端提供通訊,使用端口2380來(lái)進(jìn)行服務(wù)器間內(nèi)部通訊。

etcd 在生產(chǎn)環(huán)境中一般推薦集群方式部署。由于etcd 的leader選舉機(jī)制,要求至少為3臺(tái)或以上的奇數(shù)臺(tái)。

2.4.2 準(zhǔn)備簽發(fā)證書(shū)環(huán)境

  • CFSSL 是 CloudFlare 公司開(kāi)源的一款 PKI/TLS 工具。 CFSSL 包含一個(gè)命令行工具和一個(gè)用于簽名、驗(yàn)證和捆綁 TLS 證書(shū)的 HTTP API 服務(wù)。使用Go語(yǔ)言編寫(xiě)。
  • CFSSL 使用配置文件生成證書(shū),因此自簽之前,需要生成它識(shí)別的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
  • CFSSL 用來(lái)為 etcd 提供 TLS 證書(shū),它支持簽三種類型的證書(shū):
1、client 證書(shū),服務(wù)端連接客戶端時(shí)攜帶的證書(shū),用于客戶端驗(yàn)證服務(wù)端身份,如 kube-apiserver 訪問(wèn) etcd;
2、server 證書(shū),客戶端連接服務(wù)端時(shí)攜帶的證書(shū),用于服務(wù)端驗(yàn)證客戶端身份,如 etcd 對(duì)外提供服務(wù);
3、peer 證書(shū),相互之間連接時(shí)使用的證書(shū),如 etcd 節(jié)點(diǎn)之間進(jìn)行驗(yàn)證和通信。
這里全部都使用同一套證書(shū)認(rèn)證。

2.4.3 在 master01 節(jié)點(diǎn)上操作

### 生成Etcd證書(shū) ###
mkdir /opt/k8s
#創(chuàng)建工作目錄
cd /opt/k8s
#創(chuàng)建配置文件腳本
vim etcd.sh


#!/bin/bash
#example: ./etcd.sh etcd01 192.168.67.102 etcd02=https://192.168.67.103:2380,etcd03=https://192.168.67.104:2380

#創(chuàng)建etcd配置文件/opt/etcd/cfg/etcd
ETCD_NAME=$1
ETCD_IP=$2
ETCD_CLUSTER=$3

WORK_DIR=/opt/etcd

cat > $WORK_DIR/cfg/etcd  <<EOF
#[Member]
ETCD_NAME="${ETCD_NAME}"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF

#Member:成員配置
#ETCD_NAME:節(jié)點(diǎn)名稱,集群中唯一。成員名字,集群中必須具備唯一性,如etcd01
#ETCD_DATA_DIR:數(shù)據(jù)目錄。指定節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ)目錄,這些數(shù)據(jù)包括節(jié)點(diǎn)ID,集群ID,集群初始化配置,Snapshot文件,若未指定-wal-dir,還會(huì)存儲(chǔ)WAL文件;如果不指定會(huì)用缺省目錄
#ETCD_LISTEN_PEER_URLS:集群通信監(jiān)聽(tīng)地址。用于監(jiān)聽(tīng)其他member發(fā)送信息的地址。ip為全0代表監(jiān)聽(tīng)本機(jī)所有接口
#ETCD_LISTEN_CLIENT_URLS:客戶端訪問(wèn)監(jiān)聽(tīng)地址。用于監(jiān)聽(tīng)etcd客戶發(fā)送信息的地址。ip為全0代表監(jiān)聽(tīng)本機(jī)所有接口

#Clustering:集群配置
#ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址。其他member使用,其他member通過(guò)該地址與本member交互信息。一定要保證從其他member能可訪問(wèn)該地址。靜態(tài)配置方式下,該參數(shù)的value一定要同時(shí)在--initial-cluster參數(shù)中存在
#ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址。etcd客戶端使用,客戶端通過(guò)該地址與本member交互信息。一定要保證從客戶側(cè)能可訪問(wèn)該地址
#ETCD_INITIAL_CLUSTER:集群節(jié)點(diǎn)地址。本member使用。描述集群中所有節(jié)點(diǎn)的信息,本member根據(jù)此信息去聯(lián)系其他member
#ETCD_INITIAL_CLUSTER_TOKEN:集群Token。用于區(qū)分不同集群。本地如有多個(gè)集群要設(shè)為不同
#ETCD_INITIAL_CLUSTER_STATE:加入集群的當(dāng)前狀態(tài),new是新集群,existing表示加入已有集群。


#創(chuàng)建etcd.service服務(wù)管理文件
cat > /usr/lib/systemd/system/etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=${WORK_DIR}/cfg/etcd
ExecStart=${WORK_DIR}/bin/etcd \
--cert-file=${WORK_DIR}/ssl/server.pem \
--key-file=${WORK_DIR}/ssl/server-key.pem \
--trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--peer-cert-file=${WORK_DIR}/ssl/server.pem \
--peer-key-file=${WORK_DIR}/ssl/server-key.pem \
--peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--logger=zap \
--enable-v2
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

#--enable-v2:開(kāi)啟 etcd v2 API 接口。當(dāng)前 flannel 版本不支持 etcd v3 通信
#--logger=zap:使用 zap 日志框架。zap.Logger 是go語(yǔ)言中相對(duì)日志庫(kù)中性能最高的
#--peer開(kāi)頭的配置項(xiàng)用于指定集群內(nèi)部TLS相關(guān)證書(shū)(peer 證書(shū)),這里全部都使用同一套證書(shū)認(rèn)證
#不帶--peer開(kāi)頭的的參數(shù)是指定 etcd 服務(wù)器TLS相關(guān)證書(shū)(server 證書(shū)),這里全部都使用同一套證書(shū)認(rèn)證


systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd
#創(chuàng)建CA證書(shū)腳本
vim etcd-cert.sh

#!/bin/bash
#配置證書(shū)生成策略,讓 CA 軟件知道頒發(fā)有什么功能的證書(shū),生成用來(lái)簽發(fā)其他組件證書(shū)的根證書(shū)
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

#ca-config.json:可以定義多個(gè) profiles,分別指定不同的過(guò)期時(shí)間、使用場(chǎng)景等參數(shù);
#后續(xù)在簽名證書(shū)時(shí)會(huì)使用某個(gè) profile;此實(shí)例只有一個(gè) www 模板。
#expiry:指定了證書(shū)的有效期,87600h 為10年,如果用默認(rèn)值一年的話,證書(shū)到期后集群會(huì)立即宕掉
#signing:表示該證書(shū)可用于簽名其它證書(shū);生成的 ca.pem 證書(shū)中 CA=TRUE;
#key encipherment:表示使用非對(duì)稱密鑰加密,如 RSA 加密;
#server auth:表示client可以用該 CA 對(duì) server 提供的證書(shū)進(jìn)行驗(yàn)證;
#client auth:表示server可以用該 CA 對(duì) client 提供的證書(shū)進(jìn)行驗(yàn)證;
#注意標(biāo)點(diǎn)符號(hào),最后一個(gè)字段一般是沒(méi)有逗號(hào)的。


#-----------------------
#生成CA證書(shū)和私鑰(根證書(shū)和私鑰)
#特別說(shuō)明: cfssl和openssl有一些區(qū)別,openssl需要先生成私鑰,然后用私鑰生成請(qǐng)求文件,最后生成簽名的證書(shū)和私鑰等,但是cfssl可以直接得到請(qǐng)求文件。
cat > ca-csr.json <<EOF
{
    "CN": "etcd",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
EOF

#CN:Common Name,瀏覽器使用該字段驗(yàn)證網(wǎng)站或機(jī)構(gòu)是否合法,一般寫(xiě)的是域名
#key:指定了加密算法,一般使用rsa(size:2048)
#C:Country,國(guó)家
#ST:State,州,省
#L:Locality,地區(qū),城市
#O: Organization Name,組織名稱,公司名稱
#OU: Organization Unit Name,組織單位名稱,公司部門(mén)

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

#生成的文件:
#ca-key.pem:根證書(shū)私鑰
#ca.pem:根證書(shū)
#ca.csr:根證書(shū)簽發(fā)請(qǐng)求文件

#cfssl gencert -initca <CSRJSON>:使用 CSRJSON 文件生成新的證書(shū)和私鑰。如果不添加管道符號(hào),會(huì)直接把所有證書(shū)內(nèi)容輸出到屏幕。
#注意:CSRJSON 文件用的是相對(duì)路徑,所以 cfssl 的時(shí)候需要 csr 文件的路徑下執(zhí)行,也可以指定為絕對(duì)路徑。
#cfssljson 將 cfssl 生成的證書(shū)(json格式)變?yōu)槲募休d式證書(shū),-bare 用于命名生成的證書(shū)文件。


#-----------------------
#生成 etcd 服務(wù)器證書(shū)和私鑰
cat > server-csr.json <<EOF
{
    "CN": "etcd",
    "hosts": [
    "192.168.67.102",
    "192.168.67.103",
    "192.168.67.104"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF

#hosts:將所有 etcd 集群節(jié)點(diǎn)添加到 host 列表,需要指定所有 etcd 集群的節(jié)點(diǎn) ip 或主機(jī)名不能使用網(wǎng)段,新增 etcd 服務(wù)器需要重新簽發(fā)證書(shū)。

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

#生成的文件:
#server.csr:服務(wù)器的證書(shū)請(qǐng)求文件
#server-key.pem:服務(wù)器的私鑰
#server.pem:服務(wù)器的數(shù)字簽名證書(shū)

#-config:引用證書(shū)生成策略文件 ca-config.json
#-profile:指定證書(shū)生成策略文件中的的使用場(chǎng)景,比如 ca-config.json 中的 www
chmod +x etcd-cert.sh etcd.sh
#添加執(zhí)行權(quán)限

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

cfssl:證書(shū)簽發(fā)的工具命令
cfssljson:將 cfssl 生成的證書(shū)(json格式)變?yōu)槲募休d式證書(shū)
cfssl-certinfo:驗(yàn)證證書(shū)的信息
cfssl-certinfo -cert <證書(shū)名稱>			#查看證書(shū)的信息
cd /usr/local/bin

#準(zhǔn)備cfssl證書(shū)生成工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo

chmod +x /usr/local/bin/cfssl*
#添加執(zhí)行權(quán)限

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#創(chuàng)建用于生成CA證書(shū)、etcd 服務(wù)器證書(shū)以及私鑰的目錄
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/

./etcd-cert.sh			#生成CA證書(shū)、etcd 服務(wù)器證書(shū)以及私鑰

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

ca.pem :CA證書(shū)
ca.key.pem:CA的私鑰文件

server.pem:服務(wù)端證書(shū)
server-key.pem:服務(wù)端私鑰文件
#上傳 etcd-v3.4.26-linux-amd64.tar.gz 到 /opt/k8s 目錄中,啟動(dòng)etcd服務(wù)
cd /opt/k8s/
tar xf etcd-v3.4.26-linux-amd64.tar.gz
#解壓縮軟件包

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)
[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#創(chuàng)建用于存放 etcd 配置文件,命令文件,證書(shū)的目錄
mkdir -p /opt/etcd/{cfg,bin,ssl}

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

cd /opt/k8s/etcd-v3.4.26-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

cd /opt/k8s/

./etcd.sh etcd01 192.168.67.102 etcd02=https://192.168.67.103:2380,etcd03=https://192.168.67.104:2380
#進(jìn)入卡住狀態(tài)等待其他節(jié)點(diǎn)加入,這里需要三臺(tái)etcd服務(wù)同時(shí)啟動(dòng),如果只啟動(dòng)其中一臺(tái)后,服務(wù)會(huì)卡在那里,直到集群中所有etcd節(jié)點(diǎn)都已啟動(dòng),可忽略這個(gè)情況

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#可另外打開(kāi)一個(gè)窗口查看etcd進(jìn)程是否正常
ps -ef | grep etcd

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#把etcd相關(guān)證書(shū)文件、命令文件和服務(wù)管理文件全部拷貝到另外兩個(gè)etcd集群節(jié)點(diǎn)
scp -r /opt/etcd/ root@192.168.67.103:/opt/
scp -r /opt/etcd/ root@192.168.67.104:/opt/

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

scp /usr/lib/systemd/system/etcd.service root@192.168.67.103:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.67.104:/usr/lib/systemd/system/

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

2.4.4 在 node01 節(jié)點(diǎn)上操作

vim /opt/etcd/cfg/etcd

#[Member]
ETCD_NAME="etcd02"											#修改
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.67.103:2380"			#修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.67.103:2379"		#修改

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.67.103:2380"		#修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.67.103:2379"				#修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.67.102:2380,etcd02=https://192.168.67.103:2380,etcd03=https://192.168.67.104:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#啟動(dòng)etcd服務(wù)
systemctl start etcd
systemctl enable etcd
systemctl status etcd

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

2.4.5 在 node02 節(jié)點(diǎn)上操作

vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd03"											#修改
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.67.104:2380"			#修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.67.104:2379"		#修改

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.67.104:2380"		#修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.67.104:2379"				#修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.67.102:2380,etcd02=https://192.168.67.103:2380,etcd03=https://192.168.67.104:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#啟動(dòng)etcd服務(wù)
systemctl start etcd
systemctl enable etcd
systemctl status etcd

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#檢查etcd群集狀態(tài)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379" endpoint health --write-out=table


------------------------------------------------------------------------------------------
--cert-file:識(shí)別HTTPS端使用SSL證書(shū)文件
--key-file:使用此SSL密鑰文件標(biāo)識(shí)HTTPS客戶端
--ca-file:使用此CA證書(shū)驗(yàn)證啟用https的服務(wù)器的證書(shū)
--endpoints:集群中以逗號(hào)分隔的機(jī)器地址列表
--cluster-health:檢查etcd集群的運(yùn)行狀況
------------------------------------------------------------------------------------------

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#查看etcd集群成員列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379" --write-out=table member list

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#相關(guān)管理命令格式

#查看etcd集群健康狀態(tài)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379,https://etcd02IP:2379,https://etcd03IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰  endpoint health -wtable

#查看etcd集群狀態(tài)信息
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379,https://etcd02IP:2379,https://etcd03IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰  endpoint status -wtable

#查看etcd集群成員列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰  member list -wtable  

#備份etcd數(shù)據(jù)庫(kù)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰 snapshot save 備份文件路徑

#恢復(fù)etcd數(shù)據(jù)庫(kù)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰 snapshot restore 文件路徑

#查看備份文件的狀態(tài)信息
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰 snapshot status 文件路徑

2.5 部署 Master 組件

  1. 使用cfssl工具簽發(fā)證書(shū)和私鑰
  2. 解壓K8S服務(wù)端軟件包,獲取二進(jìn)制文件 kube-apiserver kube-controller-manager kube-scheduler kubect
  3. 準(zhǔn)備 kube-apiserver 啟動(dòng)時(shí)要調(diào)用的 bootstrap-token 認(rèn)證文件
  4. 準(zhǔn)備 kube-apiserver kube-controller-manager kube-scheduler 的服務(wù)進(jìn)程啟動(dòng)參數(shù)配置文件
  5. 準(zhǔn)備 kube-controller-manager kube-scheduler kubectlkubeconfig 集群引導(dǎo)配置文件(加入K8S集群的引導(dǎo)文件)
  6. 依次啟動(dòng) kube-apiserver kube-controller-manager kube-scheduler 的服務(wù)進(jìn)程
  7. 執(zhí)行 kubectl get cs 命令查看master組件的健康狀態(tài)

2.5.1 在 master01 節(jié)點(diǎn)上操作

#上傳 master.zip 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
cd /opt/k8s/
unzip master.zip
chmod +x *.sh

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#創(chuàng)建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#創(chuàng)建用于生成CA證書(shū)、相關(guān)組件的證書(shū)和私鑰的目錄
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
vim k8s-cert.sh	

#!/bin/bash
#配置證書(shū)生成策略,讓 CA 軟件知道頒發(fā)有什么功能的證書(shū),生成用來(lái)簽發(fā)其他組件證書(shū)的根證書(shū)
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"                 
    },
    "profiles": {
      "kubernetes": {
         "expiry": "87600h",             #證書(shū)的有效時(shí)間
         "usages": [                     #使用場(chǎng)景
            "signing",                   #簽發(fā)證書(shū)
            "key encipherment",          #密鑰
            "server auth",               #服務(wù)端事務(wù)
            "client auth"                #客戶端事務(wù)
        ]
      }
    }
  }
}
EOF

#生成CA證書(shū)和私鑰(根證書(shū)和私鑰)
cat > ca-csr.json <<EOF
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -


#-----------------------
#生成 apiserver 的證書(shū)和私鑰(apiserver和其它k8s組件通信使用)
#hosts中將所有可能作為 apiserver 的 ip 添加進(jìn)去,后面 keepalived 使用的 VIP 也要加入
cat > apiserver-csr.json <<EOF
{
    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",
      "127.0.0.1",
      "192.168.67.102",         #master01
      "192.168.67.105",         #master02
      "192.168.67.200",         #vip,后面 keepalived 使用
      "192.168.67.100",         #load balancer01(master)
      "192.168.67.101",         #load balancer02(backup)
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver


#-----------------------
#生成 kubectl 連接集群的證書(shū)和私鑰(kubectl 和 apiserver 通信使用)
cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin


#-----------------------
#生成 kube-proxy 的證書(shū)和私鑰(kube-proxy 和 apiserver 通信使用)
cat > kube-proxy-csr.json <<EOF
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

#記得刪注釋
chmod +x k8s-cert.sh
./k8s-cert.sh				#生成CA證書(shū)、相關(guān)組件的證書(shū)和私鑰

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#復(fù)制CA證書(shū)、apiserver相關(guān)證書(shū)和私鑰到 kubernetes工作目錄的 ssl 子目錄中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#復(fù)制master組件的關(guān)鍵命令文件到 kubernetes工作目錄的 bin 子目錄中
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#制作軟連接
ln -s /opt/kubernetes/bin/* /usr/local/bin/
#創(chuàng)建 bootstrap token 認(rèn)證文件,apiserver 啟動(dòng)時(shí)會(huì)調(diào)用,然后就相當(dāng)于在集群內(nèi)創(chuàng)建了一個(gè)這個(gè)用戶,接下來(lái)就可以用 RBAC 給他授權(quán)
cd /opt/k8s/
vim token.sh
#!/bin/bash
#獲取隨機(jī)數(shù)前16個(gè)字節(jié)內(nèi)容,以十六進(jìn)制格式輸出,并刪除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成 token.csv 文件,按照 Token序列號(hào),用戶名,UID,用戶組 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

chmod +x token.sh
./token.sh

cat /opt/kubernetes/cfg/token.csv

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#二進(jìn)制文件、token、證書(shū)都準(zhǔn)備好后,開(kāi)啟 apiserver 服務(wù)
cd /opt/k8s/
vim  apiserver.sh

#!/bin/bash
#example: apiserver.sh 192.168.67.102 https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379
#創(chuàng)建 kube-apiserver 啟動(dòng)參數(shù)配置文件
MASTER_ADDRESS=$1
ETCD_SERVERS=$2

cat >/opt/kubernetes/cfg/kube-apiserver <<EOF
KUBE_APISERVER_OPTS="--logtostderr=false  \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--etcd-servers=${ETCD_SERVERS} \\
--bind-address=${MASTER_ADDRESS} \\
--secure-port=6443 \\
--advertise-address=${MASTER_ADDRESS} \\
--allow-privileged=true \\
--service-cluster-ip-range=10.0.0.0/24 \\
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\
--authorization-mode=RBAC,Node \\
--enable-bootstrap-token-auth=true \\
--token-auth-file=/opt/kubernetes/cfg/token.csv \\
--service-node-port-range=30000-50000 \\
--kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem \\
--kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem \\
--tls-cert-file=/opt/kubernetes/ssl/apiserver.pem  \\
--tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--service-account-issuer=api \\
--service-account-signing-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--etcd-cafile=/opt/etcd/ssl/ca.pem \\
--etcd-certfile=/opt/etcd/ssl/server.pem \\
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--proxy-client-cert-file=/opt/kubernetes/ssl/apiserver.pem \\
--proxy-client-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--requestheader-allowed-names=kubernetes \\
--requestheader-extra-headers-prefix=X-Remote-Extra- \\
--requestheader-group-headers=X-Remote-Group \\
--requestheader-username-headers=X-Remote-User \\
--enable-aggregator-routing=true \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
EOF

#--logtostderr=true:?jiǎn)⒂萌罩?。輸出日志到?biāo)準(zhǔn)錯(cuò)誤控制臺(tái),不輸出到文件
#--v=4:日志等級(jí)。指定輸出日志的級(jí)別,v=4為調(diào)試級(jí)別詳細(xì)輸出
#--etcd-servers:etcd集群地址。指定etcd服務(wù)器列表(格式://ip:port),逗號(hào)分隔
#--bind-address:監(jiān)聽(tīng)地址。指定 HTTPS 安全接口的監(jiān)聽(tīng)地址,默認(rèn)值0.0.0.0
#--secure-port:https安全端口。指定 HTTPS 安全接口的監(jiān)聽(tīng)端口,默認(rèn)值6443
#--advertise-address:集群通告地址。通過(guò)該 ip 地址向集群其他節(jié)點(diǎn)公布 api server 的信息,必須能夠被其他節(jié)點(diǎn)訪問(wèn)
#--allow-privileged=true:?jiǎn)⒂檬跈?quán)。允許擁有系統(tǒng)特權(quán)的容器運(yùn)行,默認(rèn)值false
#--service-cluster-ip-range:Service虛擬IP地址段。指定 Service Cluster IP 地址段
#--enable-admission-plugins:準(zhǔn)入控制模塊。kuberneres集群的準(zhǔn)入控制機(jī)制,各控制模塊以插件的形式依次生效,集群時(shí)必須包含ServiceAccount,運(yùn)行在認(rèn)證(Authentication)、授權(quán)(Authorization)之后,Admission Control是權(quán)限認(rèn)證鏈上的最后一環(huán), 對(duì)請(qǐng)求API資源對(duì)象進(jìn)行修改和校驗(yàn)
#--authorization-mode:認(rèn)證授權(quán),啟用RBAC授權(quán)和節(jié)點(diǎn)自管理。在安全端口使用RBAC,Node授權(quán)模式,未通過(guò)授權(quán)的請(qǐng)求拒絕,默認(rèn)值A(chǔ)lwaysAllow。RBAC是用戶通過(guò)角色與權(quán)限進(jìn)行關(guān)聯(lián)的模式;Node模式(節(jié)點(diǎn)授權(quán))是一種特殊用途的授權(quán)模式,專門(mén)授權(quán)由kubelet發(fā)出的API請(qǐng)求,在進(jìn)行認(rèn)證時(shí),先通過(guò)用戶名、用戶分組驗(yàn)證是否是集群中的Node節(jié)點(diǎn),只有是Node節(jié)點(diǎn)的請(qǐng)求才能使用Node模式授權(quán)
#--enable-bootstrap-token-auth:?jiǎn)⒂肨LS bootstrap機(jī)制。在apiserver上啟用Bootstrap Token 認(rèn)證
#--token-auth-file=/opt/kubernetes/cfg/token.csv:指定bootstrap token認(rèn)證文件路徑
#--service-node-port-range:指定 Service  NodePort 的端口范圍,默認(rèn)值30000-32767
#–-kubelet-client-xxx:apiserver訪問(wèn)kubelet客戶端證書(shū)
#--tls-xxx-file:apiserver https證書(shū)
#1.20版本必須加的參數(shù):–-service-account-issuer,–-service-account-signing-key-file
#--etcd-xxxfile:連接Etcd集群證書(shū)
#–-audit-log-xxx:審計(jì)日志
#啟動(dòng)聚合層相關(guān)配置:–requestheader-client-ca-file,–proxy-client-cert-file,–proxy-client-key-file,–requestheader-allowed-names,–requestheader-extra-headers-prefix,–requestheader-group-headers,–requestheader-username-headers,–enable-aggregator-routing


#創(chuàng)建 kube-apiserver.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kube-apiserver.service <<EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable kube-apiserver
systemctl restart kube-apiserver
./apiserver.sh 192.168.67.102 https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379
#指定當(dāng)前服務(wù)器的地址和etcd集群的地址

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#檢查進(jìn)程是否啟動(dòng)成功
ps aux | grep kube-apiserver

ss -natp | grep 6443   
#安全端口6443用于接收HTTPS請(qǐng)求,用于基于Token文件或客戶端證書(shū)等認(rèn)證

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#啟動(dòng) scheduler 服務(wù)
cd /opt/k8s/

vim scheduler.sh
#!/bin/bash
##創(chuàng)建 kube-scheduler 啟動(dòng)參數(shù)配置文件
MASTER_ADDRESS=$1

cat >/opt/kubernetes/cfg/kube-scheduler <<EOF
KUBE_SCHEDULER_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--leader-elect=true \\
--kubeconfig=/opt/kubernetes/cfg/kube-scheduler.kubeconfig \\
--bind-address=127.0.0.1"
EOF

#-–kubeconfig:連接 apiserver 用的配置文件,用于識(shí)別 k8s 集群
#--leader-elect=true:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)啟動(dòng) leader 選舉
#k8s 中 Controller-Manager 和 Scheduler 的選主邏輯:k8s 中的 etcd 是整個(gè)集群所有狀態(tài)信息的存儲(chǔ),涉及數(shù)據(jù)的讀寫(xiě)和多個(gè) etcd 之間數(shù)據(jù)的同步,對(duì)數(shù)據(jù)的一致性要求嚴(yán)格,所以使用較復(fù)雜的 raft 算法來(lái)選擇用于提交數(shù)據(jù)的主節(jié)點(diǎn)。而 apiserver 作為集群入口,本身是無(wú)狀態(tài)的 web 服務(wù)器,多個(gè) apiserver 服務(wù)之間直接負(fù)載請(qǐng)求并不需要做選主。Controller-Manager 和 Scheduler 作為任務(wù)類型的組件,比如 controller-manager 內(nèi)置的 k8s 各種資源對(duì)象的控制器實(shí)時(shí)的 watch apiserver 獲取對(duì)象最新的變化事件做期望狀態(tài)和實(shí)際狀態(tài)調(diào)整,scheduler watch 未綁定節(jié)點(diǎn)的 pod 做節(jié)點(diǎn)選擇, 顯然多個(gè)這些任務(wù)同時(shí)工作是完全沒(méi)有必要的,所以 controller-manager 和 scheduler 也是需要選主的,但是選主邏輯和 etcd 不一樣的,這里只需要保證從多個(gè) controller-manager 和 scheduler 之間選出一個(gè) leader 進(jìn)入工作狀態(tài)即可,而無(wú)需考慮它們之間的數(shù)據(jù)一致和同步。


##生成kube-scheduler證書(shū)
#切換到k8s證書(shū)目錄操作
cd /opt/k8s/k8s-cert/
#創(chuàng)建證書(shū)請(qǐng)求文件
cat > kube-scheduler-csr.json << EOF
{
  "CN": "system:kube-scheduler",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF

#生成證書(shū)和私鑰
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler

#生成kubeconfig配置文件
KUBE_CONFIG="/opt/kubernetes/cfg/kube-scheduler.kubeconfig"
KUBE_APISERVER="https://192.168.67.102:6443"

#配置kubernetes集群參數(shù)
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=${KUBE_CONFIG}
#配置客戶端認(rèn)證參數(shù)
kubectl config set-credentials kube-scheduler \
  --client-certificate=./kube-scheduler.pem \
  --client-key=./kube-scheduler-key.pem \
  --embed-certs=true \
  --kubeconfig=${KUBE_CONFIG}
#設(shè)置上下文參數(shù)
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-scheduler \
  --kubeconfig=${KUBE_CONFIG}
#設(shè)置默認(rèn)上下文
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}


##創(chuàng)建 kube-scheduler.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kube-scheduler.service <<EOF
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler
ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable kube-scheduler
systemctl restart kube-scheduler

./scheduler.sh

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

ps aux | grep kube-scheduler

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#啟動(dòng) controller-manager 服務(wù)
vim controller-manager.sh

#!/bin/bash
##創(chuàng)建 kube-controller-manager 啟動(dòng)參數(shù)配置文件
MASTER_ADDRESS=$1

cat >/opt/kubernetes/cfg/kube-controller-manager <<EOF
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--leader-elect=true \\
--kubeconfig=/opt/kubernetes/cfg/kube-controller-manager.kubeconfig \\
--bind-address=127.0.0.1 \\
--allocate-node-cidrs=true \\
--cluster-cidr=10.244.0.0/16 \\
--service-cluster-ip-range=10.0.0.0/24 \\
--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\
--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem  \\
--root-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--cluster-signing-duration=87600h0m0s"
EOF

#––leader-elect:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)選舉(HA)
#-–kubeconfig:連接 apiserver 用的配置文件,用于識(shí)別 k8s 集群
#--cluster-cidr=10.244.0.0/16:pod資源的網(wǎng)段,需與pod網(wǎng)絡(luò)插件的值設(shè)置一致。通常,F(xiàn)lannel網(wǎng)絡(luò)插件的默認(rèn)為10.244.0.0/16,Calico插件的默認(rèn)值為192.168.0.0/16
#--cluster-signing-cert-file/–-cluster-signing-key-file:自動(dòng)為kubelet頒發(fā)證書(shū)的CA,與apiserver保持一致。指定簽名的CA機(jī)構(gòu)根證書(shū),用來(lái)簽名為 TLS BootStrapping 創(chuàng)建的證書(shū)和私鑰
#--root-ca-file:指定根CA證書(shū)文件路徑,用來(lái)對(duì) kube-apiserver 證書(shū)進(jìn)行校驗(yàn),指定該參數(shù)后,才會(huì)在 Pod 容器的 ServiceAccount 中放置該 CA 證書(shū)文件
#--experimental-cluster-signing-duration:設(shè)置為 TLS BootStrapping 簽署的證書(shū)有效時(shí)間為10年,默認(rèn)為1年


##生成kube-controller-manager證書(shū)
#切換到k8s證書(shū)目錄操作
cd /opt/k8s/k8s-cert/
#創(chuàng)建證書(shū)請(qǐng)求文件
cat > kube-controller-manager-csr.json << EOF
{
  "CN": "system:kube-controller-manager",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF

#生成證書(shū)和私鑰
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager

#生成kubeconfig配置文件
KUBE_CONFIG="/opt/kubernetes/cfg/kube-controller-manager.kubeconfig"
KUBE_APISERVER="https://192.168.67.102:6443"

#配置kubernetes集群參數(shù)
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=${KUBE_CONFIG}
#配置客戶端認(rèn)證參數(shù)
kubectl config set-credentials kube-controller-manager \
  --client-certificate=./kube-controller-manager.pem \
  --client-key=./kube-controller-manager-key.pem \
  --embed-certs=true \
  --kubeconfig=${KUBE_CONFIG}
#設(shè)置上下文參數(shù)
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-controller-manager \
  --kubeconfig=${KUBE_CONFIG}
#設(shè)置默認(rèn)上下文
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}


##創(chuàng)建 kube-controller-manager.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kube-controller-manager.service <<EOF
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager
ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl restart kube-controller-manager
./controller-manager.sh

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

ps aux | grep kube-controller-manager

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#生成kubectl連接集群的kubeconfig文件
vim admin.sh

#!/bin/bash
mkdir /root/.kube
KUBE_CONFIG="/root/.kube/config"
KUBE_APISERVER="https://192.168.67.102:6443"

#切換到k8s證書(shū)目錄操作
cd /opt/k8s/k8s-cert/

#配置kubernetes集群參數(shù)
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=${KUBE_CONFIG}
#配置客戶端認(rèn)證參數(shù)
kubectl config set-credentials admin \
  --client-certificate=./admin.pem \
  --client-key=./admin-key.pem \
  --embed-certs=true \
  --kubeconfig=${KUBE_CONFIG}
#設(shè)置設(shè)置一個(gè)環(huán)境項(xiàng),配置上下文參數(shù)
kubectl config set-context default \
  --cluster=kubernetes \
  --user=admin \
  --kubeconfig=${KUBE_CONFIG}
#設(shè)置默認(rèn)環(huán)境上下文
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
#生成的 kubeconfig 被保存到 /root/.kube/config 文件

#########################################################
#集群參數(shù)
#本段設(shè)置了所需要訪問(wèn)的集群的信息。使用set-cluster設(shè)置了需要訪問(wèn)的集群,如上為kubernetes,這只是個(gè)名稱,實(shí)際為--server指向的apiserver;--certificate-authority設(shè)置了該集群的公鑰;--embed-certs為true表示將--certificate-authority證書(shū)寫(xiě)入到kubeconfig中;--server則表示該集群的kube-apiserver地址

#用戶參數(shù)
#本段主要設(shè)置用戶的相關(guān)信息,主要是用戶證書(shū)。如上的用戶名為admin,證書(shū)為:/opt/kubernetes/ssl/admin.pem,私鑰為:/opt/kubernetes/ssl/admin-key.pem。注意客戶端的證書(shū)首先要經(jīng)過(guò)集群CA的簽署,否則不會(huì)被集群認(rèn)可。此處使用的是ca認(rèn)證方式,也可以使用token認(rèn)證,如kubelet的 TLS Boostrap 機(jī)制下的 bootstrapping 使用的就是token認(rèn)證方式。上述kubectl使用的是ca認(rèn)證,不需要token字段

#上下文參數(shù)
#集群參數(shù)和用戶參數(shù)可以同時(shí)設(shè)置多對(duì),在上下文參數(shù)中將集群參數(shù)和用戶參數(shù)關(guān)聯(lián)起來(lái)。上面的上下文名稱為default,集群為kubenetes,用戶為admin,表示使用admin的用戶憑證來(lái)訪問(wèn)kubenetes集群的default命名空間,也可以增加--namspace來(lái)指定訪問(wèn)的命名空間。

#最后使用 kubectl config use-context default 來(lái)使用名為 default 的環(huán)境項(xiàng)來(lái)作為配置。 如果配置了多個(gè)環(huán)境項(xiàng),可以通過(guò)切換不同的環(huán)境項(xiàng)名字來(lái)訪問(wèn)到不同的集群環(huán)境。
#########################################################
./admin.sh

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#綁定默認(rèn)cluster-admin管理員集群角色,授權(quán)kubectl訪問(wèn)集群
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous


#通過(guò)kubectl工具查看當(dāng)前集群組件狀態(tài)
kubectl get cs

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#查看版本信息
kubectl version

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

2.6 部署 Worker Node 組件

  1. 獲取二進(jìn)制文件 kubelet ube-proxy
  2. 準(zhǔn)備 kubelet kube-proxykubeconfig 集群引導(dǎo)配置文件 kube-proxy.kubeconfig ``bootstrap.kubeconfig(kubelet首次訪問(wèn)apiserver加入K8S集群使用引導(dǎo)文件)
  3. 準(zhǔn)備 kubelet kube-proxy 的服務(wù)進(jìn)程啟動(dòng)參數(shù)配置文件
  4. 啟動(dòng) kubelet 服務(wù)進(jìn)程,向 apiserver 發(fā)起 CSR 請(qǐng)求頒發(fā)證書(shū),master 通過(guò) CSR 請(qǐng)求后 kubelet 方可獲取到證書(shū)
  5. 加載 ipvs 模塊,啟動(dòng) kube-proxy 服務(wù)進(jìn)程
  6. 執(zhí)行 kubectl get nodes 命令查看node的狀態(tài)

2.6.1 在所有 node 節(jié)點(diǎn)上操作

2.6.1.1 node01 節(jié)點(diǎn)部署
#創(chuàng)建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

mkdir /opt/k8s

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)
[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh
cd /opt/k8s
unzip node.zip
chmod +x kubelet.sh proxy.sh

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)
[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

mkdir k8s
mv node.zip kubelet.sh proxy.sh k8s/
#在 master01 節(jié)點(diǎn)上操作
#把 kubelet、kube-proxy 拷貝到 node 節(jié)點(diǎn)
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.67.103:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.67.104:/opt/kubernetes/bin/

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導(dǎo)kubeconfig文件和kube-proxy.kubeconfig文件
#kubeconfig 文件包含集群參數(shù)(CA 證書(shū)、API Server 地址),客戶端參數(shù)(上面生成的證書(shū)和私鑰),集群 context 上下文參數(shù)(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過(guò)啟動(dòng)時(shí)指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。
mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig

vim kubeconfig.sh

#!/bin/bash
#example: kubeconfig 192.168.67.102 /opt/k8s/k8s-cert/
#創(chuàng)建bootstrap.kubeconfig文件
#該文件中內(nèi)置了 token.csv 中用戶的 Token,以及 apiserver CA 證書(shū);kubelet 首次啟動(dòng)會(huì)加載此文件,使用 apiserver CA 證書(shū)建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作為身份標(biāo)識(shí)向 apiserver 發(fā)起 CSR 請(qǐng)求

BOOTSTRAP_TOKEN=$(awk -F ',' '{print $1}' /opt/kubernetes/cfg/token.csv)
APISERVER=$1
SSL_DIR=$2

export KUBE_APISERVER="https://$APISERVER:6443"

# 設(shè)置集群參數(shù)
kubectl config set-cluster kubernetes \
  --certificate-authority=$SSL_DIR/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=bootstrap.kubeconfig
#--embed-certs=true:表示將ca.pem證書(shū)寫(xiě)入到生成的bootstrap.kubeconfig文件中

# 設(shè)置客戶端認(rèn)證參數(shù),kubelet 使用 bootstrap token 認(rèn)證
kubectl config set-credentials kubelet-bootstrap \
  --token=${BOOTSTRAP_TOKEN} \
  --kubeconfig=bootstrap.kubeconfig

# 設(shè)置上下文參數(shù)
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kubelet-bootstrap \
  --kubeconfig=bootstrap.kubeconfig

# 使用上下文參數(shù)生成 bootstrap.kubeconfig 文件
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig

#----------------------

#創(chuàng)建kube-proxy.kubeconfig文件
# 設(shè)置集群參數(shù)
kubectl config set-cluster kubernetes \
  --certificate-authority=$SSL_DIR/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=kube-proxy.kubeconfig

# 設(shè)置客戶端認(rèn)證參數(shù),kube-proxy 使用 TLS 證書(shū)認(rèn)證
kubectl config set-credentials kube-proxy \
  --client-certificate=$SSL_DIR/kube-proxy.pem \
  --client-key=$SSL_DIR/kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig

# 設(shè)置上下文參數(shù)
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig

# 使用上下文參數(shù)生成 kube-proxy.kubeconfig 文件
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

./kubeconfig.sh 192.168.67.102 /opt/k8s/k8s-cert/
#指定本地地址和證書(shū)所在目錄

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節(jié)點(diǎn)
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.67.103:/opt/kubernetes/cfg/

scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.67.104:/opt/kubernetes/cfg/

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#RBAC授權(quán),使用戶 kubelet-bootstrap 能夠有權(quán)限發(fā)起 CSR 請(qǐng)求證書(shū)
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
------------------------------------------------------------------------------------------
kubelet 采用 TLS Bootstrapping 機(jī)制,自動(dòng)完成到 kube-apiserver 的注冊(cè),在 node 節(jié)點(diǎn)量較大或者后期自動(dòng)擴(kuò)容時(shí)非常有用。
Master apiserver 啟用 TLS 認(rèn)證后,node 節(jié)點(diǎn) kubelet 組件想要加入集群,必須使用CA簽發(fā)的有效證書(shū)才能與 apiserver 通信,當(dāng) node 節(jié)點(diǎn)很多時(shí),簽署證書(shū)是一件很繁瑣的事情。因此 Kubernetes 引入了 TLS bootstraping 機(jī)制來(lái)自動(dòng)頒發(fā)客戶端證書(shū),kubelet 會(huì)以一個(gè)低權(quán)限用戶自動(dòng)向 apiserver 申請(qǐng)證書(shū),kubelet 的證書(shū)由 apiserver 動(dòng)態(tài)簽署。

kubelet 首次啟動(dòng)通過(guò)加載 bootstrap.kubeconfig 中的用戶 Token 和 apiserver CA 證書(shū)發(fā)起首次 CSR 請(qǐng)求,這個(gè) Token 被預(yù)先內(nèi)置在 apiserver 節(jié)點(diǎn)的 token.csv 中,其身份為 kubelet-bootstrap 用戶和 system:kubelet-bootstrap 用戶組;想要首次 CSR 請(qǐng)求能成功(即不會(huì)被 apiserver 401 拒絕),則需要先創(chuàng)建一個(gè) ClusterRoleBinding,將 kubelet-bootstrap 用戶和 system:node-bootstrapper 內(nèi)置 ClusterRole 綁定(通過(guò) kubectl get clusterroles 可查詢),使其能夠發(fā)起 CSR 認(rèn)證請(qǐng)求。

TLS bootstrapping 時(shí)的證書(shū)實(shí)際是由 kube-controller-manager 組件來(lái)簽署的,也就是說(shuō)證書(shū)有效期是 kube-controller-manager 組件控制的;kube-controller-manager 組件提供了一個(gè) --experimental-cluster-signing-duration 參數(shù)來(lái)設(shè)置簽署的證書(shū)有效時(shí)間;默認(rèn)為 8760h0m0s,將其改為 87600h0m0s,即 10 年后再進(jìn)行 TLS bootstrapping 簽署證書(shū)即可。

也就是說(shuō) kubelet 首次訪問(wèn) API Server 時(shí),是使用 token 做認(rèn)證,通過(guò)后,Controller Manager 會(huì)為 kubelet 生成一個(gè)證書(shū),以后的訪問(wèn)都是用證書(shū)做認(rèn)證了。
------------------------------------------------------------------------------------------
#在 node01 節(jié)點(diǎn)上操作
#啟動(dòng) kubelet 服務(wù)
cd /opt/k8s

vim kubelet.sh

#!/bin/bash

NODE_ADDRESS=$1
DNS_SERVER_IP=${2:-"10.0.0.2"}

#創(chuàng)建 kubelet 啟動(dòng)參數(shù)配置文件
cat >/opt/kubernetes/cfg/kubelet <<EOF
KUBELET_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--hostname-override=${NODE_ADDRESS} \\
--network-plugin=cni \\
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
--config=/opt/kubernetes/cfg/kubelet.config \\
--cert-dir=/opt/kubernetes/ssl \\
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2"
EOF

#--hostname-override:指定kubelet節(jié)點(diǎn)在集群中顯示的主機(jī)名或IP地址,默認(rèn)使用主機(jī)hostname;kube-proxy和kubelet的此項(xiàng)參數(shù)設(shè)置必須完全一致
#--network-plugin:?jiǎn)⒂肅NI
#--kubeconfig:指定kubelet.kubeconfig文件位置,當(dāng)前為空路徑,會(huì)自動(dòng)生成,用于如何連接到apiserver,里面含有kubelet證書(shū),master授權(quán)完成后會(huì)在node節(jié)點(diǎn)上生成 kubelet.kubeconfig 文件
#--bootstrap-kubeconfig:指定連接 apiserver 的 bootstrap.kubeconfig 文件
#--config:指定kubelet配置文件的路徑,啟動(dòng)kubelet時(shí)將從此文件加載其配置
#--cert-dir:指定master頒發(fā)的kubelet證書(shū)生成目錄
#--pod-infra-container-image:指定Pod基礎(chǔ)容器(Pause容器)的鏡像。Pod啟動(dòng)的時(shí)候都會(huì)啟動(dòng)一個(gè)這樣的容器,每個(gè)pod里容器之間的相互通信需要Pause的支持,啟動(dòng)Pause需要Pause基礎(chǔ)鏡像


#----------------------
#創(chuàng)建kubelet配置文件(該文件實(shí)際上就是一個(gè)yml文件,語(yǔ)法非常嚴(yán)格,不能出現(xiàn)tab鍵,冒號(hào)后面必須要有空格,每行結(jié)尾也不能有空格)
cat >/opt/kubernetes/cfg/kubelet.config <<EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: ${NODE_ADDRESS}
port: 10250
readOnlyPort: 10255
cgroupDriver: systemd
clusterDNS:
- ${DNS_SERVER_IP}
clusterDomain: cluster.local
failSwapOn: false
authentication:
  anonymous:
    enabled: true
EOF

#PS:當(dāng)命令行參數(shù)與此配置文件(kubelet.config)有相同的值時(shí),就會(huì)覆蓋配置文件中的該值。


#----------------------
#創(chuàng)建 kubelet.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kubelet.service <<EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet
ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet
chmod +x *.sh
./kubelet.sh 192.168.67.103 node01

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

ps aux | grep kubelet

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#在 master01 節(jié)點(diǎn)上操作,通過(guò) CSR 請(qǐng)求
#檢查到 node01 節(jié)點(diǎn)的 kubelet 發(fā)起的 CSR 請(qǐng)求,Pending 表示等待集群給該節(jié)點(diǎn)簽發(fā)證書(shū)
kubectl get csr

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

kubectl certificate approve node-csr-VXBLUwWvGyHmU38mqZ3xusiKmDxzDVJc1okyRinafvw

kubectl get csr

kubectl get nodes

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#在 node01 節(jié)點(diǎn)上操作
#加載 ip_vs 模塊
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#啟動(dòng)proxy服務(wù)
cd /opt/k8s

vim proxy.sh

#!/bin/bash

NODE_ADDRESS=$1

#創(chuàng)建 kube-proxy 啟動(dòng)參數(shù)配置文件
cat >/opt/kubernetes/cfg/kube-proxy <<EOF
KUBE_PROXY_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--hostname-override=${NODE_ADDRESS} \\
--cluster-cidr=10.244.0.0/16 \\
--proxy-mode=ipvs \\
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"
EOF

#--hostnameOverride: 參數(shù)值必須與 kubelet 的值一致,否則 kube-proxy 啟動(dòng)后會(huì)找不到該 Node,從而不會(huì)創(chuàng)建任何 ipvs 規(guī)則
#--cluster-cidr:指定 Pod 網(wǎng)絡(luò)使用的聚合網(wǎng)段,Pod 使用的網(wǎng)段和 apiserver 中指定的 service 的 cluster ip 網(wǎng)段不是同一個(gè)網(wǎng)段。 kube-proxy 根據(jù) --cluster-cidr 判斷集群內(nèi)部和外部流量,指定 --cluster-cidr 選項(xiàng)后 kube-proxy 才會(huì)對(duì)訪問(wèn) Service IP 的請(qǐng)求做 SNAT,即來(lái)自非 Pod 網(wǎng)絡(luò)的流量被當(dāng)成外部流量,訪問(wèn) Service 時(shí)需要做 SNAT。
#--kubeconfig: 指定連接 apiserver 的 kubeconfig 文件
#--proxy-mode:指定流量調(diào)度模式為ipvs模式,可添加--ipvs-scheduler選項(xiàng)指定ipvs調(diào)度算法(rr|lc|dh|sh|sed|nq)
#rr: round-robin,輪詢。
#lc: least connection,最小連接數(shù)。
#dh: destination hashing,目的地址哈希。
#sh: source hashing ,原地址哈希。
#sed: shortest expected delay,最短期望延時(shí)。
#nq: never queue ,永不排隊(duì)。

#----------------------
#創(chuàng)建 kube-proxy.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kube-proxy.service <<EOF
[Unit]
Description=Kubernetes Proxy
After=network.target

[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
./proxy.sh 192.168.67.103
ps aux | grep kube-proxy

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

2.6.1.2 node02 節(jié)點(diǎn)部署
#在 node01 節(jié)點(diǎn)上操作
cd /opt/k8s
scp kubelet.sh proxy.sh root@192.168.67.104:/opt/

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#在 node02 節(jié)點(diǎn)上操作
#啟動(dòng)kubelet服務(wù)
cd /opt
chmod +x kubelet.sh
./kubelet.sh 192.168.67.104 node02

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#在 master01 節(jié)點(diǎn)上操作
kubectl get csr

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#通過(guò) CSR 請(qǐng)求
kubectl certificate approve  node-csr-WSrwQuqYysVMvZdjTyZRkN0-D8LPXV38Zuynor0R16k 

kubectl get csr

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#加載 ip_vs 模塊
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)

#使用proxy.sh腳本啟動(dòng)proxy服務(wù)
./proxy.sh 192.168.67.104
ps aux | grep kube-proxy

[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分,云原生,kubernetes,架構(gòu)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-745445.html

到了這里,關(guān)于[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 云原生Kubernetes: Ubuntu 安裝 K8S 1.23版本(單Master架構(gòu)) 及故障恢復(fù)

    云原生Kubernetes: Ubuntu 安裝 K8S 1.23版本(單Master架構(gòu)) 及故障恢復(fù)

    目錄 一、實(shí)驗(yàn) 1.環(huán)境 2.安裝 Ubuntu 3.連接Ubuntu 4.master節(jié)點(diǎn)安裝docker 5.node節(jié)點(diǎn)安裝docker 6.master節(jié)點(diǎn)安裝K8S 7.添加K8S工作節(jié)點(diǎn) 8.安裝網(wǎng)絡(luò)插件calico 9.故障 10.故障恢復(fù) 11.測(cè)試k8s網(wǎng)絡(luò)和coredns 二、問(wèn)題 1.Ubuntu如何修改鏡像源 2.Ubuntu和Windows之間如何實(shí)現(xiàn)復(fù)制粘貼 3.Ubuntu如何開(kāi)啟openssh

    2024年02月21日
    瀏覽(22)
  • 【云原生|Kubernetes】02-Kubeadm安裝部署Kubernetes集群

    【云原生|Kubernetes】02-Kubeadm安裝部署Kubernetes集群

    前面簡(jiǎn)單介紹了Kubernetes的相關(guān)架構(gòu)及其組件,這一章節(jié)我們將介紹如何快速搭建Kubernetes的集群,這里我們將使用官方支持的用于部署 Kubernetes 的工具— kubeadm。 主機(jī)名 ip地址 節(jié)點(diǎn)類型 系統(tǒng)版本 master.example.com 192.168.194.128 master,etcd centos7.x node1.example.com 192.168.194.130 node1 cent

    2024年02月03日
    瀏覽(22)
  • 云原生|kubernetes|kubernetes集群部署神器kubekey安裝部署高可用k8s集群(半離線形式)

    云原生|kubernetes|kubernetes集群部署神器kubekey安裝部署高可用k8s集群(半離線形式)

    前面利用kubekey部署了一個(gè)簡(jiǎn)單的非高可用,etcd單實(shí)例的kubernetes集群,經(jīng)過(guò)研究,發(fā)現(xiàn)部署過(guò)程可以簡(jiǎn)化,省去了一部分下載過(guò)程(主要是下載kubernetes組件的過(guò)程)只是kubernetes版本會(huì)固定在1.22.16版本,etcd集群可以部署成生產(chǎn)用的外部集群,并且apiserver等等組件也是高可用,

    2024年02月15日
    瀏覽(26)
  • 【云原生】Kubernetes二進(jìn)制--多節(jié)點(diǎn)Master集群高可用

    【云原生】Kubernetes二進(jìn)制--多節(jié)點(diǎn)Master集群高可用

    作用 :實(shí)現(xiàn)高可用 apiserver 對(duì)外安全通信端口 6443 ,對(duì)內(nèi)端口 8080 1、實(shí)現(xiàn)高可用方法 etcd:etcd群集至少是3副本,奇數(shù)臺(tái),通過(guò)raft算法,保證數(shù)據(jù)的一致性 node節(jié)點(diǎn):承載業(yè)務(wù),跟Master進(jìn)行對(duì)接 master節(jié)點(diǎn):高可用使用keepalived+LB方案,keepalived能夠提供VIP和主備,LB實(shí)現(xiàn)負(fù)載均衡

    2024年02月04日
    瀏覽(28)
  • 二進(jìn)制搭建Kubernetes集群(一)——部署etcd集群和單master

    二進(jìn)制搭建Kubernetes集群(一)——部署etcd集群和單master

    注意:生產(chǎn)環(huán)境中,etcd集群和master、node節(jié)點(diǎn)都應(yīng)該部署在不同的機(jī)器上,此處為了實(shí)驗(yàn)方便,將三臺(tái)etcd節(jié)點(diǎn)分別部署在了master和node節(jié)點(diǎn)上了 k8s集群master01:192.168.126.27?? ?kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02:192.168.80.21 k8s集群node01:192.168.80.11?? ?

    2024年02月10日
    瀏覽(26)
  • a24.ansible 生產(chǎn)實(shí)戰(zhàn)案例 -- 基于kubeadm安裝kubernetes v1.20 -- 集群部署(一)

    a24.ansible 生產(chǎn)實(shí)戰(zhàn)案例 -- 基于kubeadm安裝kubernetes v1.20 -- 集群部署(一)

    源碼下載地址:https://github.com/raymond999999/kubernetes-ansible 角色 機(jī)器名 機(jī)器配置 ip地址 安裝軟件 ansible ansible-server.example.local 2C2G 172.31.3.100 ansible master1 k8s-master01.example.local 2C4G 172.31.3.101 chrony-client、docker、kubeadm 、kubelet、kubectl master2 k8s-master02.example.local 2C4G 172.31.3.102 chrony-clien

    2024年02月11日
    瀏覽(25)
  • 《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12單master集群》

    《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12單master集群》

    如下圖所示: 主機(jī)名 K8S版本 系統(tǒng)版本 內(nèi)核版本 IP地址 備注 k8s-master-62 1.24.12 Ubuntu 20.04.5 LTS 5.15.0-69-generic 192.168.1.62 master節(jié)點(diǎn) k8s-worker-63 1.24.12 Ubuntu 20.04.5 LTS 5.15.0-69-generic 192.168.1.63 worker節(jié)點(diǎn) k8s-worker-64 1.24.12 Ubuntu 20.04.5 LTS 5.15.0-69-generic 192.168.1.64 worker節(jié)點(diǎn) 說(shuō)明:分別在對(duì)應(yīng)的

    2023年04月25日
    瀏覽(19)
  • 云原生 黑馬Kubernetes教程(K8S教程)筆記——第一章 kubernetes介紹——Master集群控制節(jié)點(diǎn)、Node工作負(fù)載節(jié)點(diǎn)、Pod控制單元

    云原生 黑馬Kubernetes教程(K8S教程)筆記——第一章 kubernetes介紹——Master集群控制節(jié)點(diǎn)、Node工作負(fù)載節(jié)點(diǎn)、Pod控制單元

    參考文章:kubernetes介紹 本章節(jié)主要介紹應(yīng)用程序在服務(wù)器上部署方式演變以及kubernetes的概念、組件和工作原理。 在部署應(yīng)用程序的方式上,主要經(jīng)歷了三個(gè)時(shí)代: 傳統(tǒng)部署:互聯(lián)網(wǎng)早期,會(huì)直接將應(yīng)用程序部署在物理機(jī)上 優(yōu)點(diǎn):簡(jiǎn)單,不需要其它技術(shù)的參與 缺點(diǎn):不能為

    2024年02月04日
    瀏覽(34)
  • 【云原生】二進(jìn)制k8s集群(下)部署高可用master節(jié)點(diǎn)

    【云原生】二進(jìn)制k8s集群(下)部署高可用master節(jié)點(diǎn)

    ?在上一篇文章中,就已經(jīng)完成了二進(jìn)制k8s集群部署的搭建,但是單機(jī)master并不適用于企業(yè)的實(shí)際運(yùn)用(因?yàn)閱螜C(jī)master中,僅僅只有一臺(tái)master作為節(jié)點(diǎn)服務(wù)器的調(diào)度指揮,一旦宕機(jī)。就意味著整個(gè)集群的癱瘓,所以成熟的k8s的集群一定要考慮到master的高可用。)企業(yè)的運(yùn)用一

    2024年02月12日
    瀏覽(32)
  • 【云原生】Kubeadmin部署Kubernetes集群

    【云原生】Kubeadmin部署Kubernetes集群

    目錄 ?編輯 一、環(huán)境準(zhǔn)備 1.2調(diào)整內(nèi)核參數(shù) 二、所有節(jié)點(diǎn)部署docker 三、所有節(jié)點(diǎn)安裝kubeadm,kubelet和kubectl 3.1定義kubernetes源 3.2開(kāi)機(jī)自啟kubelet 四、部署K8S集群 4.1查看初始化需要的鏡像 4.2在 master 節(jié)點(diǎn)上傳 v1.20.11.zip 壓縮包至 /opt 目錄 4.3復(fù)制鏡像和腳本到 node 節(jié)點(diǎn),并在 nod

    2024年02月09日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包