Kubernetes1.12 二進制集羣搭建

一、環境準備

1.1、系統環境

主機名

系統

IP

組件

master01

CentOS7.4

172.169.18.223

etcd

kube-apiserver

kube-controller-manager

kube-scheduler

node01

CentOS7.4

172.169.18.230

etcd

kubelet

kube-proxy

docker

node02

CentOS7.4

172.169.18.232

etcd

kubelet

kube-proxy

docker

1.2、關閉swap

# swapoff -a

# sed -i 's/.*swap.*/#&/' /etc/fstab

1.3、關閉防火牆和selinux

1.4、配置轉發參數

cat <<EOF >  /etc/sysctl.d/k8s.conf

net.ipv4.ip_forward = 1

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

# sysctl --system

1.5、下載安裝包

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.12.md#downloads-for-v1122

1.png

2.png

二、搭建服務

1、上傳安裝包到服務器:

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

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

2、安裝etcd服務(三個節點的集羣)

[root@master01 ~]# yum install etcd –y

3.png

#修改如下配置文件:

# vim /etc/etcd/etcd.conf

#maser01節點

ETCD_DATA_DIR="/var/lib/etcd/"

ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://127.0.0.1:4001"

ETCD_NAME="master01"

ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

ETCD_INITIAL_CLUSTER="master01=http://172.169.18.223:2380,node01=http://172.169.18.230:2380,node02=http://172.169.18.232:2380"

ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

ETCD_INITIAL_CLUSTER_STATE="new"

#node01節點

ETCD_DATA_DIR="/var/lib/etcd"

ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://127.0.0.1:4001"

ETCD_NAME="node01"

ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

ETCD_INITIAL_CLUSTER="master01=http://172.169.18.223:2380,node01=http://172.169.18.230:2380,node02=http://172.169.18.232:2380"

ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

ETCD_INITIAL_CLUSTER_STATE="new"

#node02

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

ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"

ETCD_NAME="node02"

ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

ETCD_INITIAL_CLUSTER="master01=http://172.169.18.223:2380,node01=http://172.169.18.230:2380,node02=http://172.169.18.232:2380"

ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

ETCD_INITIAL_CLUSTER_STATE="new"

按如上配置分別啓動集羣,啓動集羣后,將會進入集羣選舉狀態,若出現大量超時,則需要檢查主機的防火牆是否關閉,或主機之間是否能通過2380端口通信,集羣建立後通過以下命令檢查集羣狀態。

3)在任意節點查看集羣狀態

# etcdctl member list

4.png

當關閉node01節點後,選舉自動切換到node02上

5.png

4)檢查集羣健康狀態(在三個節點中的任意一個上面都可以查看)

# etcdctl cluster-health

6.png

到此,etcd集羣搭建完畢!!!

3、運行Master節點組件

3.1、解壓,複製配置文件

[root@master01 opt]# tar -zxvf kubernetes-server-linux-amd64.tar.gz

[root@master01 opt]# mkdir -p /opt/kubernetes/{bin,cfg}

[root@master01 opt]# mv kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl} /opt/kubernetes/bin

3.2、apiserver服務

(1)配置文件

[root@master01 opt]# cat /opt/kubernetes/cfg/kube-apiserver

#日誌級別

KUBE_LOG_LEVEL="--v=4"

#Etcd服務地址

KUBE_ETCD_SERVERS="--etcd-servers=http://172.169.18.223: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=172.169.18.223"

#允許容器請求特權模式,默認false

KUBE_ALLOW_PRIV="--allow-privileged=false"

#集羣分配的IP範圍,自定義但是要跟後面的kubelet(服務節點)的配置DNS在一個區間

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=172.169.0.0/16"

(2)創建systemd服務文件:

cat >/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}

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

EOF

(3)啓動服務,並設置開機啓動:

[root@master01 opt]# systemctl daemon-reload

[root@master01 opt]# systemctl enable kube-apiserver.service

[root@master01 opt]# systemctl start kube-apiserver.service

7.png

注意:apiserver默認支持etcd3,如果是etcd2,需啓動時指定版本選項--storage-backend=etcd2

3.3、scheduler服務

(1)創建配置文件

cat >/opt/kubernetes/cfg/kube-scheduler <<EOF

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=4"

KUBE_MASTER="--master=172.169.18.223:8080"

KUBE_LEADER_ELECT="--leader-elect"

EOF

8.png


(2)創建服務器啓動文件

[root@master01 opt]# cat>/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_LOGTOSTDERR} \

\${KUBE_LOG_LEVEL} \

\${KUBE_MASTER} \

\${KUBE_LEADER_ELECT}

Restart=on-failure

[Install]

WantedBy=multi-user.target

EOF

9.png

啓動服務

[root@master01 opt]# systemctl daemon-reload

[root@master01 opt]# systemctl enable kube-scheduler.service

[root@master01 opt]# systemctl start kube-scheduler.service  

11.png

3.4、contorller-manager服務

(1)創建文件

cat > /opt/kubernetes/cfg/kube-controller-manager<<EOF

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=4"

KUBE_MASTER="--master=172.169.18.223:8080"

EOF

12.png

(2)創建系統啓動文件

cat > /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_LOGTOSTDERR} \

\${KUBE_LOG_LEVEL} \

\${KUBE_MASTER} \

\${KUBE_LEADER_ELECT}

Restart=on-failure

[Install]

WantedBy=multi-user.target

EOF

啓動服務

[root@master01 opt]# systemctl daemon-reload

[root@master01 opt]# systemctl enable kube-controller-manager.service

[root@master01 opt]# systemctl start kube-controller-manager.service

13.png

3.5、kubelet服務

(1)kubelet.kubeconfig配置文件

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

apiVersion: v1

kind: Config

clusters:

- cluster:

server: http://172.169.18.223:8080

name: local

contexts:

- context:

cluster: local

name: local

current-context: local

(2)kubelet配置文件

# vim /opt/kubernetes/cfg/kubelet

# 啓用日誌標準錯誤

KUBE_LOGTOSTDERR="--logtostderr=true"

# 日誌級別

KUBE_LOG_LEVEL="--v=4"

# Kubelet服務IP地址

NODE_ADDRESS="--address=172.169.18.223"

# Kubelet服務端口

NODE_PORT="--port=10250"

# 自定義節點名稱

NODE_HOSTNAME="--hostname-override=172.169.18.223"

# kubeconfig路徑,指定連接API服務器

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

# 允許容器請求特權模式,默認false

KUBE_ALLOW_PRIV="--allow-privileged=false"

# DNS信息

KUBELET_DNS_IP="--cluster-dns=172.169.18.2"

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

# 禁用使用Swap

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

(3)kubelet systemd配置文件

[root@master ~]# vim /usr/lib/systemd/system/kubelet.service

[Unit]

Description=Kubernetes Kubelet

After=docker.service

Requires=docker.service

[Service]

EnvironmentFile=-/opt/kubernetes/cfg/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

15.png

(4)啓動服務

[root@master ~]# systemctl enable kubelet

[root@master ~]# systemctl start kubelet

至此master就已經配置完成,如若配置中有錯誤,可以通過#journalctl -u 服務名稱查看報錯。

爲方便使用添加環境變量

[root@master01 opt]# echo "export PATH=\$PATH:/opt/kubernetes/bin" >> /etc/profile

[root@master01 opt]# source /etc/profile

3、小結

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

查看Master節點組件進程狀態:

16.png


4、node節點(docker1.18環境)

#yum install -y yum-utils device-mapper-persistent-data lvm2

4.1、解決複製

[root@node01 opt]# tar -zxvf kubernetes-node-linux-amd64.tar.gz

[root@node01 opt]# mkdir -p /opt/kubernetes/{bin,cfg}

[root@node01 opt]# mv kubernetes/node/bin/{kubelet,kube-proxy} /opt/kubernetes/bin/

4.2、kubelet服務

(1)創建kubeconfig配置文件:

[root@node01 opt]# vim /opt/kubernetes/cfg/kubelet.kubeconfig

apiVersion: v1

kind: Config

clusters:

- cluster:

server: http://172.169.18.223:8080

name: local

contexts:

- context:

cluster: local

name: local

current-context: local

備註:kubeconfig文件用於kubelet連接master apiserver。

(2)創建配置文件:

[root@slave2 opt]# cat /opt/kubernetes/cfg/kubelet

# 啓用日誌標準錯誤

KUBE_LOGTOSTDERR="--logtostderr=true"

# 日誌級別

KUBE_LOG_LEVEL="--v=4"

# Kubelet服務IP地址

NODE_ADDRESS="--address=172.169.18.230"

# Kubelet服務端口

NODE_PORT="--port=10250"

# 自定義節點名稱

NODE_HOSTNAME="--hostname-override=172.169.18.230"

# kubeconfig路徑,指定連接API服務器

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

# 允許容器請求特權模式,默認false

KUBE_ALLOW_PRIV="--allow-privileged=false"

# DNS信息

KUBELET_DNS_IP="--cluster-dns=172.169.18.2"

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

# 禁用使用Swap

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

17.png

(3)創建systemd服務文件

cat>/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 \

\${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

EOF

18.png

(4)啓動服務

[root@node01 ~]# systemctl daemon-reload

[root@node01 ~]# systemctl enable kubelet.service

[root@node01 ~]# systemctl start kubelet.service

19.png

4.3、kube-proxy服務

(1)創建配置文件

[root@node01 cfg]# vim kube-proxy

# 啓用日誌標準錯誤

KUBE_LOGTOSTDERR="--logtostderr=true"

# # 日誌級別

KUBE_LOG_LEVEL="--v=4"

# # 自定義節點名稱

NODE_HOSTNAME="--hostname-override=172.169.18.230"

# # API服務地址

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

(2)創建systemd服務文件

[root@node01 ]# cat /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

20.png

啓動服務

[root@node01 ~]# systemctl daemon-reload

[root@node01 ~]# systemctl enable kube-proxy.service

[root@node01 ~]# systemctl start kube-proxy.service

4、小結

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

查看狀態

21.png

說明組件都在運行。

如果啓動失敗,請查看啓動日誌,例如:

#journalctl -u kubelet


三、安裝flannel服務搭建(3個節點)

3.1、安裝Flannel服務

1)yum安裝flannel

# yum install flannel -y

2)配置flannel文件

# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld_bak

# vim /etc/sysconfig/flanneld

FLANNEL_ETCD_ENDPOINTS="http://172.169.18.223:2379,http://172.169.18.230:2379,http://172.169.18.232:2379"

22.png

3)配置etcd中關於flannel的key(只能在etcd節點上操作)

Flannel使用Etcd進行配置,來保證多個Flannel實例之間的配置一致性,所以需要在etcd上進行如下配置('/atomic.io/network/config'這個key與上面的/etc/sysconfig/flannel中的配置項FLANNEL_ETCD_PREFIX是相對應的,錯誤的話啓動就會出錯):

# etcdctl mkdir /atomic.io/network

# etcdctl mk /atomic.io/network/config '{ "Network": "192.169.0.0/16" }'

23.png

備註:該ip網段可以任意設定,隨便設定一個網段都可以。容器的ip就是根據這個網段進行自動分配的,ip分配後,容器一般是可以對外聯網的(網橋模式,只要宿主機能上網就可以)

4)配置docker啓動文件

# vim /usr/lib/systemd/system/docker.service

#添加如下參數

EnvironmentFile=-/etc/sysconfig/flanneld

EnvironmentFile=-/run/flannel/subnet.env

ExecStart=/usr/bin/dockerd --bip=${FLANNEL_SUBNET}

保持,重啓docker服務

5)啓動服務

[root@master ~]# systemctl start flanneld.service

[root@master ~]# systemctl enable flanneld.service

24.png

重啓docker

# systemctl restart docker

25.png

3、在node01和node02節點配置

3.1、安裝Flannel服務

1)yum安裝flannel

# yum install flannel -y

2)配置flannel文件

# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld_bak

# vim /etc/sysconfig/flanneld

26.png

34)配置docker啓動文件

# vim /usr/lib/systemd/system/docker.service

#添加如下參數

EnvironmentFile=-/etc/sysconfig/flanneld

EnvironmentFile=-/run/flannel/subnet.env

ExecStart=/usr/bin/dockerd --bip=${FLANNEL_SUBNET}

保持,重啓docker服務

4)啓動服務

[root@slave1 ~]# systemctl start flanneld.service

[root@slave1 ~]# systemctl enable flanneld.service

重啓docker,獲取分配的ip段

27.png

4、查看宿主獲取的IP段

# ps aux|grep docker|grep "bip"

28.png

“bip=192.169.4.1/24”這個參數,它限制了所在節點容器獲得的IP範圍。 該IP範圍是由Flannel自動分配的,由Flannel通過保存在Etcd服務中的記錄確保它們不會重複。


5、驗證集羣是否部署成功

# kubectl get nodes

30.png

# kubectl get cs

33.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章