186. 【kubernetes】二進(jìn)制文件方式安裝 Kubernetes 集群(二)

1. 下載 Kubernetes 服務(wù)器的二進(jìn)制文件

在 Github 下載 Kubernetes 的二進(jìn)制文件(先進(jìn)入 Release 頁(yè)面,再點(diǎn)擊 CHANGELOG),


Release 頁(yè)

CHANGELOG 頁(yè)

下載 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é)果:

kube-apiserver 驗(yàn)證部署是否成功

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
    
驗(yàn)證結(jié)果

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
    
kube-scheduler 驗(yàn)證安裝成功

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)完成了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乱灵,一起剝皮案震驚了整個(gè)濱河市塑崖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痛倚,老刑警劉巖规婆,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝉稳,居然都是意外死亡抒蚜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門耘戚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嗡髓,“玉大人,你說(shuō)我怎么就攤上這事收津《稣猓” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵撞秋,是天一觀的道長(zhǎng)长捧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吻贿,這世上最難降的妖魔是什么串结? 我笑而不...
    開(kāi)封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮舅列,結(jié)果婚禮上奉芦,老公的妹妹穿的比我還像新娘。我一直安慰自己剧蹂,他們只是感情好声功,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著宠叼,像睡著了一般先巴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冒冬,一...
    開(kāi)封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天伸蚯,我揣著相機(jī)與錄音,去河邊找鬼简烤。 笑死剂邮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的横侦。 我是一名探鬼主播挥萌,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绰姻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了引瀑?” 一聲冷哼從身側(cè)響起狂芋,我...
    開(kāi)封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憨栽,沒(méi)想到半個(gè)月后帜矾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屑柔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年屡萤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掸宛。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灭衷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旁涤,到底是詐尸還是另有隱情翔曲,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布劈愚,位于F島的核電站瞳遍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏菌羽。R本人自食惡果不足惜掠械,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望注祖。 院中可真熱鬧猾蒂,春花似錦、人聲如沸是晨。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罩缴。三九已至蚊逢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箫章,已是汗流浹背烙荷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留檬寂,地道東北人终抽。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親昼伴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匾旭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容