1. 程式人生 > >Kubernetes(K8S)叢集管理Docker容器

Kubernetes(K8S)叢集管理Docker容器

一、架構拓撲圖

https://s5.51cto.com/oss/201711/20/53e0a846f89d2cdcd6b194b90e852f76.png

二、環境規劃

角色

IP

元件

master

172.25.77.1

etcd

kube-apiserver

kube-controller-manager

kube-scheduler

node01

172.25.77.2

kubelet

kube-proxy

docker

node02

172.25.77.3

kubelet

kube-proxy

docker

下載完成後,上傳到伺服器:

kubernetes-server-linux-amd64.tar.gz上傳到master節點。

kubernetes-node-linux-amd64.tar.gz 上傳到node節點。

3.2  安裝etcd3

etcd-3.2.22-1.el7.x86_64.rpm

1

2

3

4

5

6

7

8

k8s-master# yum install etcd –y

k8s-master

# vi /etc/etcd/etcd.conf 

ETCD_NAME="default"

ETCD_DATA_DIR="/var/lib/etcd/default"

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379

k8s-master# systemctl enable etcd

k8s-master# systemctl start etcd

3.3 執行Master節點元件

1

2

3

k8s-master

# tar zxvf kubernetes-server-linux-amd64.tar.gz

k8s-master# mkdir -p /opt/kubernetes/{bin,cfg}

k8s-master# mv kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl} /opt/kubernetes/bi

3.3.1 apiserver

建立配置檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

# vi /opt/kubernetes/cfg/kube-apiserver

# 啟用日誌標準錯誤

KUBE_LOGTOSTDERR="--logtostderr=true"

# 日誌級別

KUBE_LOG_LEVEL="--v=4"

# Etcd服務地址

KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.0.211:2379"

# API服務監聽地址

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

# API服務監聽埠

KUBE_API_PORT="--insecure-port=8080"

# 對叢集中成員提供API服務地址

KUBE_ADVERTISE_ADDR="--advertise-address=192.168.0.211"

# 允許容器請求特權模式,預設false

KUBE_ALLOW_PRIV="--allow-privileged=false"

# 叢集分配的IP範圍

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.10.10.0/24"

建立systemd服務檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# vi /lib/systemd/system/kube-apiserver.service 

[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}

ExecStart=/opt/kubernetes/bin/kube-apiserver \

${KUBE_LOGTOSTDERR} \

${KUBE_LOG_LEVEL} \

${KUBE_ETCD_SERVERS} \

${KUBE_API_ADDRESS} \

${KUBE_API_PORT} \

${KUBE_ADVERTISE_ADDR} \

${KUBE_ALLOW_PRIV} \

${KUBE_SERVICE_ADDRESSES}

Restart=on-failure

[Install]

WantedBy=multi-user.target

啟動服務,並設定開機啟動:

1

2

3

# systemctl daemon-reload

# systemctl enable kube-apiserver

# systemctl restart kube-apiserver

注意:apiserver預設支援etcd3,如果是etcd2,需啟動時指定版本選項--storage-backend=etcd2

3.3.2 scheduler

建立配置檔案:

1

2

3

4

5

# vi /opt/kubernetes/cfg/kube-scheduler

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=4"

KUBE_MASTER="--master=172.25.77.1:8080"

KUBE_LEADER_ELECT="--leader-elect"

建立systemd服務檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# vi /lib/systemd/system/kube-scheduler.service

[Unit]

Description=Kubernetes Scheduler

Documentation=https://github.com/kubernetes/kubernetes

[Service]

EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler

ExecStart=/opt/kubernetes/bin/kube-scheduler \

${KUBE_LOGTOSTDERR} \

${KUBE_LOG_LEVEL} \

${KUBE_MASTER} \

${KUBE_LEADER_ELECT}

Restart=on-failure

[Install]

WantedBy=multi-user.target

啟動服務,並設定開機啟動:

1

2

3

# systemctl daemon-reload

# systemctl enable kube-scheduler

# systemctl restart kube-scheduler

3.3.3 controller-manager

建立配置檔案:

1

2

3

4

# vi /opt/kubernetes/cfg/kube-controller-manager

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=4"

KUBE_MASTER="--master=172.25.77.1:8080"

建立systemd服務檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# vi /lib/systemd/system/kube-controller-manager.service

[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_LOGTOSTDERR} \

${KUBE_LOG_LEVEL} \

${KUBE_MASTER} \

${KUBE_LEADER_ELECT}

Restart=on-failure

[Install]

WantedBy=multi-user.target

啟動服務,並設定開機啟動:

1

2

3

# systemctl daemon-reload

# systemctl enable kube-controller-manager

# systemctl restart kube-controller-manager

3.3.4 小結

Master節點元件就全部啟動了,需要注意的是服務啟動順序有依賴,先啟動etcd,再啟動apiserver,其他元件無順序要求。

檢視Master節點元件程序狀態:

說明元件都在執行。

如果啟動失敗,請檢視啟動日誌,例如:

#journalctl -u kube-apiserver

3.4  執行Node節點元件

1

2

3

k8s-node01# tar zxvf kubernetes-node-linux-amd64.tar.gz

k8s-node01# mkdir -p /opt/kubernetes/{bin,cfg}

k8s-node01# mv kubernetes/node/bin/{kubelet,kube-proxy} /opt/kubernetes/bin/

3.4.1 kubelet

建立kubeconfig配置檔案:

1

2

3

4

5

6

7

8

9

10

11

12

# vi /opt/kubernetes/cfg/kubelet.kubeconfig

apiVersion: v1

kind: Config

clusters:

- cluster:

server: http://172.25.77.1:8080

name: local

contexts:

- context:

cluster: local

name: local

current-context: local

kubeconfig檔案用於kubelet連線master apiserver。

建立配置檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# vi /opt/kubernetes/cfg/kubelet            

# 啟用日誌標準錯誤

KUBE_LOGTOSTDERR="--logtostderr=true"

# 日誌級別

KUBE_LOG_LEVEL="--v=4"

# Kubelet服務IP地址

NODE_ADDRESS="--address=172.25.77.2"

# Kubelet服務埠

NODE_PORT="--port=10250"

# 自定義節點名稱

NODE_HOSTNAME="--hostname-override=172.25.77.2"

# kubeconfig路徑,指定連線API伺服器

KUBELET_KUBECONFIG="--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig"

# 允許容器請求特權模式,預設false

KUBE_ALLOW_PRIV="--allow-privileged=false"

# DNS資訊

KUBELET_DNS_IP="--cluster-dns=10.10.10.2"

KUBELET_DNS_DOMAIN="--cluster-domain=cluster.local"

# 禁用使用Swap

KUBELET_SWAP="--fail-swap-on=false"

建立systemd服務檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

# vi /lib/systemd/system/kubelet.service

[Unit]

Description=Kubernetes Kubelet

After=docker.service

Requires=docker.service

[Service]

EnvironmentFile=-/opt/kubernetes/cfg/kubelet

ExecStart=/opt/kubernetes/bin/kubelet \

${KUBE_LOGTOSTDERR} \

${KUBE_LOG_LEVEL} \

${NODE_ADDRESS} \

${NODE_PORT} \

${NODE_HOSTNAME} \

${KUBELET_KUBECONFIG} \

${KUBE_ALLOW_PRIV} \

${KUBELET_DNS_IP} \

${KUBELET_DNS_DOMAIN} \

${KUBELET_SWAP}

Restart=on-failure

KillMode=process

[Install]

WantedBy=multi-user.target

啟動服務,並設定開機啟動:

1

2

3

# systemctl daemon-reload

# systemctl enable kubelet

# systemctl restart kubelet

3.4.2 proxy

建立配置檔案:

1

2

3

4

5

6

7

8

9

# vi /opt/kubernetes/cfg/kube-proxy            

# 啟用日誌標準錯誤

KUBE_LOGTOSTDERR="--logtostderr=true"

# 日誌級別

KUBE_LOG_LEVEL="--v=4"

# 自定義節點名稱

NODE_HOSTNAME="--hostname-override=172.25.77.2"

# API服務地址

KUBE_MASTER="--master=http://172.25.77.1:8080"

建立systemd服務檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# vi /lib/systemd/system/kube-proxy.service

[Unit]

Description=Kubernetes Proxy

After=network.target

[Service]

EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy

ExecStart=/opt/kubernetes/bin/kube-proxy \

${KUBE_LOGTOSTDERR} \

${KUBE_LOG_LEVEL} \

${NODE_HOSTNAME} \

${KUBE_MASTER}

Restart=on-failure

[Install]

WantedBy=multi-user.target

啟動服務,並設定開機啟動:

1

2

3

# systemctl daemon-reload

# systemctl enable kube-proxy

# systemctl restart kube-proxy

3.4.3 小結

其他節點加入叢集與node01方式相同,但需修改kubelet的--address和--hostname-override選項為本機IP。

檢視Node節點元件程序狀態:

說明元件都在執行。

如果啟動失敗,請檢視啟動日誌,例如:

#journalctl -u kubelet

3.5 驗證叢集是否部署成功

設定可執行檔案到系統變數,方便使用:

1

2

# echo "export PATH=$PATH:/opt/kubernetes/bin" >> /etc/profile

# source /etc/profile

檢視叢集節點狀態:

兩個節點都加入到了kubernetes叢集,就此部署完成。