您好,登錄后才能下訂單哦!
一、環境準備
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、上傳安裝包到服務器:
kubernetes-server-linux-amd64.tar.gz上傳到master節點
kubernetes-node-linux-amd64.tar.gz 上傳到node節點
2、安裝etcd服務(三個節點的集群)
[root@master01 ~]# yum install etcd –y
#修改如下配置文件:
# 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
當關閉node01節點后,選舉自動切換到node02上
4)檢查集群健康狀態(在三個節點中的任意一個上面都可以查看)
# etcdctl cluster-health
到此,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
注意: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
(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
啟動服務
[root@master01 opt]# systemctl daemon-reload
[root@master01 opt]# systemctl enable kube-scheduler.service
[root@master01 opt]# systemctl start kube-scheduler.service
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
(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
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
(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節點組件進程狀態:
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"
(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
(4)啟動服務
[root@node01 ~]# systemctl daemon-reload
[root@node01 ~]# systemctl enable kubelet.service
[root@node01 ~]# systemctl start kubelet.service
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
啟動服務
[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即可。
查看狀態
說明組件都在運行。
如果啟動失敗,請查看啟動日志,例如:
#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"
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" }'
備注:該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
重啟docker
# systemctl restart docker
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
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段
4、查看宿主獲取的IP段
# ps aux|grep docker|grep "bip"
“bip=192.169.4.1/24”這個參數,它限制了所在節點容器獲得的IP范圍。 該IP范圍是由Flannel自動分配的,由Flannel通過保存在Etcd服務中的記錄確保它們不會重復。
5、驗證集群是否部署成功
# kubectl get nodes
# kubectl get cs
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。