1. 下載 Kubernetes 服務(wù)器的二進(jìn)制文件
在 Github 下載 Kubernetes 的二進(jìn)制文件(先進(jìn)入 Release 頁(yè)面,再點(diǎn)擊 CHANGELOG),
下載 Server 端二進(jìn)制(Server Binaries)文件的下載頁(yè)面進(jìn)行下載浩村。
主要的服務(wù)程序二進(jìn)制文件列表如下所示拴曲,
文件名 | 說(shuō)明 |
---|---|
kube-apiserver | kube-apiserver 主程序 |
kube-apiserver.docker_tag | kube-apiserver docker 鏡像的 tag |
kube-apiserver.tar | kube-apiserver docker 鏡像文件 |
kube-controller-manager | kube-controller-manager 主程序 |
kube-controller-manager.docker_tag | kube-controller-manager docker 鏡像的 tag |
kube-controller-manager.tar | kube-controller-manager docker 鏡像文件 |
kube-scheduler | kube-scheduler 主程序 |
kube-scheduler.docker_tag | kube-scheduler docker 鏡像的 tag |
kube-scheduler.tar | kube-scheduler docker 鏡像文件 |
kubelet | kubelet 主程序 |
kube-proxy | kube-proxy 主程序 |
kube-proxy.docker_tag | kube-proxy docker 鏡像的 tag |
kube-proxy.tar | kube-proxy docker 鏡像文件 |
kubectl | 客戶端命令行工具 |
kubeadm | Kubernetes 集群安裝的命令工具 |
apiextensions-apiserver | 提供實(shí)現(xiàn)自定義資源對(duì)象的擴(kuò)展 API Server |
kube-aggregator | 聚合 API Server 程序 |
在 Kubernetes 的 Master 節(jié)點(diǎn)上需要部署的服務(wù)包括 etcd缺谴、kube-apiserver、kube-controller-manager 和 kube-scheduler女责。
在工作節(jié)點(diǎn)(Worker Node) 上需要部署的服務(wù)包括 docker漆枚、kubelet 和 kube-proxy。
將 Kubernetes 的二進(jìn)制可執(zhí)行文件復(fù)制到 /usr/bin 目錄下抵知,然后在 /usr/lib/systemd/system 目錄下為各服務(wù)創(chuàng)建 systemd 服務(wù)配置文件墙基,這樣就完成了軟件的安裝。
2. 部署 kube-apiserver 服務(wù)
設(shè)置 kube-apiserver 服務(wù)需要的 CA 相關(guān)證書辛藻。準(zhǔn)備 master_ssl.cnf
文件用于生成 x509 v3 版本的證書碘橘,
[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = k8s-1
DNS.6 = k8s-2
DNS.7 = k8s-3
IP.1 = 169.169.0.1
IP.2 = 172.16.0.10
IP.3 = 172.16.0.100
PS: DNS.5
對(duì)應(yīng)的節(jié)點(diǎn)1 的域名,依次類推吱肌;IP.1
不用修改痘拆,IP.2
是master節(jié)點(diǎn)的 IP,IP.3
是相同網(wǎng)段氮墨,但沒(méi)有被使用的IP(即:ping 不通的ip)纺蛆。
然后用 openssl
命令創(chuàng)建 kube-apiserver 的服務(wù)端 CA 證書,包括 api-server.key 和apiserver.crt 文件规揪,將其保存到 /etc/kubernetes/pki 目錄下桥氏。
openssl genrsa -out apiserver.key 2048
openssl req -new -key apiserver.key -config master_ssl.cnf -subj "/CN=172.16.0.10" -out apiserver.csr
openssl x509 -req -in apiserver.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile master_ssl.cnf -out apiserver.crt
為 kube-apiserver 服務(wù)創(chuàng)建 systemd 服務(wù)配置文件 /usr/lib/systemd/system/kube-apiserver.service
:
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=always
[Install]
WantedBy=multi-user.target
配置文件 /etc/kubernetes/apiserver
的內(nèi)容通過(guò)環(huán)境變量 KUBE_API_ARGS
設(shè)置 kube-apiserver
的全部啟動(dòng)參數(shù),包含 CA 安全配置的啟動(dòng)參數(shù)如下:
KUBE_API_ARGS="--secure-port=6443 \
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt \
--tls-private-key-file=/etc/kubernetes/pki/apiserver.key \
--client-ca-file=/etc/kubernetes/pki/ca.crt \
--apiserver-count=1 \
--endpoint-reconciler-type=master-count \
--etcd-servers=https://172.16.0.10:2379,https://172.16.0.11:2379 \
--etcd-cafile=/etc/kubernetes/pki/ca.crt \
--etcd-certfile=/etc/etcd/pki/etcd_client.crt \
--etcd-keyfile=/etc/etcd/pki/etcd_client.key \
--service-cluster-ip-range=169.169.0.0/16 \
--service-node-port-range=30000-32767 \
--allow-privileged=true \
--v=0 \
--external-hostname=172.16.0.10 \
--anonymous-auth=false \
--service-account-issuer=https://admin \
--service-account-key-file=/etc/kubernetes/pki/apiserver.key \
--service-account-signing-key-file=/etc/kubernetes/pki/apiserver.key"
當(dāng)前安裝的是 Kubernetes v1.23.1
使用以前老版本的參數(shù)啟動(dòng)失敗猛铅,這里按報(bào)錯(cuò)提示字支,新增了--external-hostname
、--anonymous-auth
奸忽、--service-account-issuer
堕伪、--service-account-key-file
、--service-account-signing-key-file
幾個(gè)參數(shù)栗菜,這個(gè)幾個(gè)參數(shù)的值欠雌,可能寫的不規(guī)范,以后遇到問(wèn)題再來(lái)調(diào)整疙筹,目前啟動(dòng)是能成功的
配置文件準(zhǔn)備完畢后富俄,啟動(dòng) kube-apiserver 服務(wù)禁炒,并設(shè)置為開(kāi)機(jī)自啟動(dòng):
systemctl restart kube-apiserver && systemctl enable kube-apiserver
驗(yàn)證結(jié)果:
3. 創(chuàng)建客戶端 CA 證書
-
kube-controller-manager、kube-scheduler霍比、kubelt 和 kube-proxy 服務(wù)作為客戶端連接 kube-apiserver 服務(wù)幕袱,需要為它們創(chuàng)建客戶端 CA 證書進(jìn)行訪問(wèn)。這里對(duì)這幾個(gè)服務(wù)統(tǒng)一創(chuàng)建一個(gè)證書:
openssl genrsa -out client.key 2048 openssl req -new -key client.key -subj "/CN=admin" -out client.csr openssl x509 -req -in client.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out client.crt -days 36500
其中 -subj 參數(shù)中的 “/CN” 的名稱被設(shè)置為“admin”悠瞬,用于標(biāo)識(shí)連接 kube-apiserver的客戶端的名稱凹蜂。
-
將生成的 client.key 和 client.crt 文件保存在 /etc/kubernetes/pki 目錄下
cp client.key client.crt /etc/kubernetes/pki/
4. 創(chuàng)建客戶端連接 kube-apiserver 服務(wù)所需的 kubeconfig 配置文件
- 為 kube-controller-manager、kube-scheduler阁危、kubelet 和 kube-proxy 服務(wù)統(tǒng)一創(chuàng)建一個(gè) kubeconfig 文件作為連接 kube-apiserver 服務(wù)的配置文件玛痊,后續(xù)也作為 kubectl 命令行工具連接 kube-apiserver 服務(wù)的配置文件。
- 在 kubeconfig 文件中主要設(shè)置訪問(wèn)訪問(wèn) kube-apiserver 的 URL 地址及所需 CA 證書等的相關(guān)參數(shù)狂打,如下:
apiVersion: v1 kind: Config clusters: - name: default cluster: server: https://172.16.0.100:9443 certificate-authority: /etc/kubernetes/pki/ca.crt users: - name: admin user: client-certificate: /etc/kubernetes/pki/client.crt client-key: /etc/kubernetes/pki/client.key contexts: - context: cluster: default user: admin name: default current-context: default
- 將
kubeconfig
文件保存到/etc/kubernetes
目錄下擂煞。
5. 部署 kube-controller-manager 服務(wù)
- 為 kube-controller-manager 服務(wù)創(chuàng)建 systemd 服務(wù)配置文件
/usr/lib/systemd/system/kube-controller-manager.service
:[Unit] Description=Kubernetes Controller Manager Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=/etc/kubernetes/controller-manager ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS Restart=always [Install] WantedBy=multi-user.target
- 配置文件
/etc/kubernetes/controller-manager
的內(nèi)容為通過(guò)環(huán)境變量KUBE_CONTROLLER_MANAGER_ARGS
設(shè)置的 kube-controller-manager 的全部啟動(dòng)參數(shù),包含 CA 安全配置的啟動(dòng)參數(shù)趴乡,如下:KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \ --leader-elect=false \ --service-cluster-ip-range=169.169.0.0/16 \ --service-account-private-key-file=/etc/kubernetes/pki/apiserver.key \ --root-ca-file=/etc/kubernetes/pki/ca.crt \ --v=0"
- 配置文件準(zhǔn)備完畢后对省,在 Master 主機(jī)上啟動(dòng) kube-controller-manager 服務(wù)并設(shè)置為開(kāi)機(jī)自啟動(dòng):
systemctl restart kube-controller-manager && systemctl enable kube-controller-manager
6. 配置 kube-scheduler 服務(wù)
-
為 kube-scheduler 服務(wù)創(chuàng)建 systed 服務(wù)配置文件
/usr/lib/systemd/system/kube-scheduler.service
,如下:[Unit] Description=Kubernetes Scheduler Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=/etc/kubernetes/scheduler ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS Restart=always [Install] WantedBy=multi-user.target
-
配置文件 /etc/kubernetes/scheduler 的內(nèi)容為通過(guò)環(huán)境變量 KUBE_SCHEDULER_ARGS 設(shè)置的 kube-scheduler 的全部啟動(dòng)參數(shù)晾捏,包含 CA 安全配置的啟動(dòng)參數(shù)蒿涎,如下:
KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \ --leader-elect=false \ --v=0"
-
配置文件準(zhǔn)備完畢后,在 Master 主機(jī)上啟動(dòng) kube-scheduler 服務(wù)并設(shè)置為開(kāi)機(jī)自啟動(dòng):
systemctl restart kube-scheduler && systemctl enable kube-scheduler
7. 使用 HAProxy 和 keepalived 部署高可用負(fù)載均衡器
- 這里搭建的兩節(jié)點(diǎn)的環(huán)境惦辛,這一步只把流程走通劳秋。
- 部署 HAProxy 實(shí)例,準(zhǔn)備 HAProxy 的配置文件 haproxy.cfg胖齐,內(nèi)容如下:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4096
no strict-limits
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend kube-apiserver
mode tcp
bind *:9443
option tcplog
default_backend kube-apiserver
listen stats
mode http
bind *:8888
stats auth admin:password
stats refresh 5s
stats realm HAProxy\ Statistics
stats uri /stats
log 127.0.0.1 local3 err
backend kube-apiserver
mode tcp
balance roundrobin
server k8s-master1 172.16.0.10:6443 check
- 以 Docker 容器方式運(yùn)行 HAProxy 且鏡像使用 haproxytech/haproxy-debian玻淑,將配置文件 haproxy.cfg 掛載到容器的 /usr/local/etc/haproxy 目錄下,啟動(dòng)命令如下呀伙,
docker run -d --name k8s-haproxy --net=host --restart=always -v ${PWD}/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxytech/haproxy-debian
- 部署 keepalived 實(shí)例补履,編輯 keepalived.conf,內(nèi)容如下:
! Configuration File for keepalived
global_defs {
router_id LVS_1
}
vrrp_script checkhaproxy
{
script "/usr/bin/check-haproxy.sh"
interval 2
weight -30
}
vrrp_instance VI_1 {
state MASTER
interface enp7s0f1
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
172.16.0.100/24 dev enp7s0f1
}
authentication {
auth_type PASS
auth_pass password
}
track_script {
checkhaproxy
}
}
注意:我本地的網(wǎng)卡名是:enp7s0f1
剿另,這個(gè)網(wǎng)卡名在上面的文件內(nèi)出現(xiàn)了兩次箫锤,都需要改成實(shí)際的網(wǎng)卡名。
- 新建一個(gè) check-haproxy.sh 并將其保存到 /usr/bin 目錄下雨女,內(nèi)容如下:
#!/bin/bash
# Program:
# check health
# History:
# 2022/01/14 junfenghe.cloud@qq.com version:0.0.1
path=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export path
count=$(netstat -apn | grep 9443 | wc -l)
if [ ${count} -gt 0 ]
then
exit 0
else
exit 1
fi
- 以 Docker 容器方式進(jìn)行 HAProxy 且鏡像使用 osixia/keeplived谚攒,將配置文件 keepalived.conf 掛載到容器的 /container/service/keepalived/assets 目錄下,啟動(dòng)命令如下:
docker run -d --name k8s-keepalived --restart=always --net=host --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW -v ${PWD}/keepalived.conf:/container/service/keepalived/assets/keepalived.conf -v ${PWD}/check-haproxy.sh:/usr/bin/check-haproxy.sh osixia/keepalived --copy-service
- 使用 curl 命令即可驗(yàn)證通過(guò) HAProxy 的 172.16.0.100:9443 地址是否可以訪問(wèn)到 kube-apiserver 服務(wù):
[root@qijing1 client]# curl -v -k https://172.16.0.100:9443
# 底下是驗(yàn)證結(jié)果:
* About to connect() to 172.16.0.100 port 9443 (#0)
* Trying 172.16.0.100...
* Connected to 172.16.0.100 (172.16.0.100) port 9443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* NSS: client certificate not found (nickname not specified)
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=172.16.0.10
* start date: 1月 13 12:46:58 2022 GMT
* expire date: 12月 20 12:46:58 2121 GMT
* common name: 172.16.0.10
* issuer: CN=172.16.0.10
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 172.16.0.100:9443
> Accept: */*
>
< HTTP/1.1 401 Unauthorized
< Audit-Id: 6bdfd440-0a1d-4102-9ad3-4d9c636792ce
< Cache-Control: no-cache, private
< Content-Type: application/json
< Date: Fri, 14 Jan 2022 02:39:26 GMT
< Content-Length: 157
<
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "Unauthorized",
"reason": "Unauthorized",
"code": 401
* Connection #0 to host 172.16.0.100 left intact
}
可以看到 TCP/IP 連接創(chuàng)建成功戚篙,得到響應(yīng)碼五鲫,得到相應(yīng)碼為 401 的應(yīng)答溺职,說(shuō)明通過(guò) 172.16.0.100 成功訪問(wèn)到了后端的 kube-apiserver 服務(wù)岔擂。至此位喂,Master 所需的 3 個(gè)服務(wù)就全部啟動(dòng)完成了。