天天看點

Kubernetes1.12 二進制叢集搭建

一、環境準備

1.1、系統環境

主機名 系統 IP 元件
master01 CentOS7.4 172.169.18.223

etcd

kube-apiserver

kube-controller-manager

kube-scheduler

node01 172.169.18.230

kubelet

kube-proxy

docker

node02 172.169.18.232

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

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

二、搭建服務

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

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

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

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

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

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

#修改如下配置檔案:

# 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_NAME="node01"

#node02

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

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

ETCD_NAME="node02"

按如上配置分别啟動叢集,啟動叢集後,将會進入叢集選舉狀态,若出現大量逾時,則需要檢查主機的防火牆是否關閉,或主機之間是否能通過2380端口通信,叢集建立後通過以下指令檢查叢集狀态。

3)在任意節點檢視叢集狀态

# etcdctl member list

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

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

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

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

# etcdctl cluster-health

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

到此,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

(3)啟動服務,并設定開機啟動:

[root@master01 opt]# systemctl daemon-reload

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

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

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

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

3.3、scheduler服務

(1)建立配置檔案

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

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_MASTER="--master=172.169.18.223:8080"

KUBE_LEADER_ELECT="--leader-elect"

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

(2)建立伺服器啟動檔案

[root@master01 opt]# cat>/lib/systemd/system/kube-scheduler.service<<EOF

Description=Kubernetes Scheduler

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

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

\${KUBE_MASTER} \

\${KUBE_LEADER_ELECT}

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

啟動服務

[root@master01 opt]# systemctl daemon-reload

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

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

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

3.4、contorller-manager服務

(1)建立檔案

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

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

(2)建立系統啟動檔案

cat > /lib/systemd/system/kube-controller-manager.service<<EOF

Description=Kubernetes Controller Manager

EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager

ExecStart=/opt/kubernetes/bin/kube-controller-manager \

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

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

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

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

current-context: local

(2)kubelet配置檔案

# vim /opt/kubernetes/cfg/kubelet

# 啟用日志标準錯誤

# 日志級别

# 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

# 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

Description=Kubernetes Kubelet

After=docker.service

Requires=docker.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}

KillMode=process

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

(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節點元件程序狀态:

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

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

備注:kubeconfig檔案用于kubelet連接配接master apiserver。

(2)建立配置檔案:

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

NODE_ADDRESS="--address=172.169.18.230"

NODE_HOSTNAME="--hostname-override=172.169.18.230"

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

(3)建立systemd服務檔案

cat>/lib/systemd/system/kubelet.service<<EOF

ExecStart=/opt/kubernetes/bin/kubelet \

\${NODE_ADDRESS} \

\${NODE_PORT} \

\${NODE_HOSTNAME} \

\${KUBELET_KUBECONFIG} \

\${KUBELET_DNS_IP} \

\${KUBELET_DNS_DOMAIN} \

\${KUBELET_SWAP}

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

[root@node01 ~]# systemctl daemon-reload

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

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

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

4.3、kube-proxy服務

[root@node01 cfg]# vim kube-proxy

# # 日志級别

# # 自定義節點名稱

# # API服務位址

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

(2)建立systemd服務檔案

[root@node01 ]# cat /lib/systemd/system/kube-proxy.service

Description=Kubernetes Proxy

After=network.target

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

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

${KUBE_MASTER}

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

[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即可。

檢視狀态

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

說明元件都在運作。

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

#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"

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

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" }'

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

備注:該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

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

重新開機docker

# systemctl restart docker

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

3、在node01和node02節點配置

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

34)配置docker啟動檔案

4)啟動服務

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

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

重新開機docker,擷取配置設定的ip段

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

4、檢視宿主擷取的IP段

# ps aux|grep docker|grep "bip"

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

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

Kubernetes1.12 二進制叢集搭建

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

# kubectl get nodes

Kubernetes1.12 二進制叢集搭建
Kubernetes1.12 二進制叢集搭建

繼續閱讀