前言
- 從二進(jìn)制包部署 3節(jié)點(diǎn)環(huán)境(不要害怕笋额,并不難)
- 介紹部署時各組件得作用,加強(qiáng)理解篷扩。
環(huán)境
操作系統(tǒng):centos 7.5
Kubernetes版本:v1.8.13(1 master兄猩,2 node)
Docker版本: 18.03.1-ce
準(zhǔn)備工作:
裝3臺 centos7.5得機(jī)器(本實驗使用vmware虛擬機(jī), 2G內(nèi)存)
所有機(jī)器執(zhí)行如下命令:
-
setenforce 0
(臨時關(guān)閉selinux) -
sed -i /SELINUX=/cSELINUX=diabled /etc/selinux/config
(永久關(guān)閉selinux) -
systemctl stop firewalld
(關(guān)閉防火墻,手動配置端口規(guī)則更好) -
systemctl disable firewalld
(永久關(guān)閉防火墻)
下載k8s server&node 二進(jìn)制包
server包:
https://dl.k8s.io/v1.8.13/kubernetes-server-linux-amd64.tar.gz
node 包:
https://dl.k8s.io/v1.8.13/kubernetes-node-linux-amd64.tar.gz
包參考地址枢冤, 版本v1.8.13
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#v1813
一:master 節(jié)點(diǎn)搭建
需要構(gòu)建:
- etcd: 數(shù)據(jù)庫
- API Server: 程序入口
- Scheduler: 調(diào)度器
- Controller Manager: 具體業(yè)務(wù)處理控制
1. 清空 docker環(huán)境
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
2. 安裝etcd
etcd: 用于持久化存儲集群中所有的資源對象鸠姨,如Node、Service淹真、Pod讶迁、RC、Namespace等核蘸;API Server提供了操作etcd的封裝接口API巍糯,這些API基本上都是集群中資源對象的增刪改查及監(jiān)聽資源變化的接口。這里記住它是存放信息得數(shù)據(jù)庫即可客扎。
yum install etcd -y
-
vi /etc/etcd/etcd.conf
修改祟峦,注意替換2個<MASTER_IP>:
ETCD_NAME="default"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_LISTEN_CLIENT_URLS="http://<MASTER_IP>:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://<MASTER_IP>:2379"
- 啟動:
systemctl enable etcd
systemctl start etcd
3. 構(gòu)建k8s server應(yīng)用目錄
注:應(yīng)用家目錄為 /opt/kubernetes
將剛剛下載好得kubernetes-server-linux-amd64.tar.gz 拷進(jìn)master節(jié)點(diǎn)上任意位置。
tar zxvf kubernetes-server-linux-amd64.tar.gz
mkdir -p /opt/kubernetes/{bin,cfg}
mv kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl} /opt/kubernetes/bin
4. 啟動API Server 組件
API Server: 提供了資源對象的唯一操作入口虐唠,其他所有組件都必須通過它提供的API來操作資源數(shù)據(jù)搀愧,通過對相關(guān)的資源數(shù)據(jù)“全量查詢”+“變化監(jiān)聽”,這些組件可以很“實時”地完成相關(guān)的業(yè)務(wù)功能疆偿。
- 創(chuàng)建 apiserver配置文件
vi /opt/kubernetes/cfg/kube-apiserver
添加如下內(nèi)容咱筛,注意替換2個<MASTER_IP>:
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志級別
KUBE_LOG_LEVEL="--v=4"
# Etcd服務(wù)地址
KUBE_ETCD_SERVERS="--etcd-servers=http://<MASTER_IP>:2379"
# API服務(wù)監(jiān)聽地址
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
# API服務(wù)監(jiān)聽端口
KUBE_API_PORT="--insecure-port=8080"
# 對集群中成員提供API服務(wù)地址
KUBE_ADVERTISE_ADDR="--advertise-address=<MASTER_IP>"
# 允許容器請求特權(quán)模式,默認(rèn)false
KUBE_ALLOW_PRIV="--allow-privileged=false"
# 集群分配的IP范圍
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.10.10.0/24"
- 注冊為systemd服務(wù)
vi /lib/systemd/system/kube-apiserver.service
添加如下內(nèi)容:
[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
- 啟動API Server
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl restart kube-apiserver
5. 啟動 Scheduler 組件
scheduler:集群中的調(diào)度器杆故,負(fù)責(zé)Pod在集群節(jié)點(diǎn)中的調(diào)度分配
- 創(chuàng)建scheduler配置文件
vi /opt/kubernetes/cfg/kube-scheduler
添加如下內(nèi)容迅箩,注意替換<MASTER_IP>:
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=<MASTER_IP>:8080"
KUBE_LEADER_ELECT="--leader-elect"
- 注冊為systemd服務(wù)
vi /lib/systemd/system/kube-scheduler.service
添加如下內(nèi)容:
[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
- 啟動Scheduler
systemctl daemon-reload
systemctl enable kube-scheduler
systemctl restart kube-scheduler
6. 啟動Controller Manager組件
controller manager:集群內(nèi)部的管理控制中心,其主要目的是實現(xiàn)Kubernetes集群的故障檢測和恢復(fù)的自動化工作处铛,比如根據(jù)RC的定義完成Pod的復(fù)制或移除饲趋,以確保Pod實例數(shù)符合RC副本的定義;根據(jù)Service與Pod的管理關(guān)系撤蟆,完成服務(wù)的Endpoints對象的創(chuàng)建和更新渊鞋;其他諸如Node的發(fā)現(xiàn)、管理和狀態(tài)監(jiān)控恩脂、死亡容器所占磁盤空間及本地緩存的鏡像文件的清理等工作也是由Controller Manager完成的畸颅。
- 創(chuàng)建controller manager 配置文件
vi /opt/kubernetes/cfg/kube-controller-manager
添加如下內(nèi)容,注意替換<MASTER_IP>:
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=<MASTER_IP>:8080"
- 注冊為systemd服務(wù)
vi /lib/systemd/system/kube-controller-manager.service
添加如下內(nèi)容:
[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
- 啟動Controller Manager
systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl restart kube-controller-manager
7. 查看服務(wù)啟動情況
ps aux | grep kube
可以看到3個組件得啟動情況如下:
二:node節(jié)點(diǎn)搭建
需要構(gòu)建:
- docker
- kubelet: 具體業(yè)務(wù)處理者
- kube-proxy: 負(fù)載均衡器
1. docker環(huán)境
- 清空舊環(huán)境:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
- 安裝docker:
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce
systemctl start docker
systemctl enable docker
2. 構(gòu)建k8s node節(jié)點(diǎn)應(yīng)用目錄
注:應(yīng)用家目錄為 /opt/kubernetes
將剛剛下載好得kubernetes-node-linux-amd64.tar.gz 拷進(jìn)node節(jié)點(diǎn)上任意位置讨衣。
tar zxvf kubernetes-node-linux-amd64.tar.gz
mkdir -p /opt/kubernetes/{bin,cfg}
mv kubernetes/node/bin/{kubelet,kube-proxy} /opt/kubernetes/bin/
3. 啟動Kubelet組件
kubelet: 負(fù)責(zé)本Node節(jié)點(diǎn)上的Pod的創(chuàng)建换棚、修改、監(jiān)控反镇、刪除等全生命周期管理固蚤,同時Kubelet定時“上報”本Node的狀態(tài)信息到API Server里。
- 創(chuàng)建kubeconfig配置文件歹茶,用于連接master節(jié)點(diǎn)api server
vi /opt/kubernetes/cfg/kubelet.kubeconfig
添加如下內(nèi)容夕玩,注意替換<MASTER_IP>:
apiVersion: v1
kind: Config
clusters:
- cluster:
server: http://<MASTER_IP>:8080
name: local
contexts:
- context:
cluster: local
name: local
current-context: local
- 創(chuàng)建kublet配置文件
vi /opt/kubernetes/cfg/kubelet
添加如下內(nèi)容你弦,注意替換兩個<NODE_IP>:
# 啟用日志標(biāo)準(zhǔn)錯誤
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志級別
KUBE_LOG_LEVEL="--v=4"
# Kubelet服務(wù)IP地址
NODE_ADDRESS="--address=<NODE_IP>"
# Kubelet服務(wù)端口
NODE_PORT="--port=10250"
# 自定義節(jié)點(diǎn)名稱
NODE_HOSTNAME="--hostname-override=<NODE_IP>"
# kubeconfig路徑,指定連接API服務(wù)器
KUBELET_KUBECONFIG="--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig"
# 允許容器請求特權(quán)模式风秤,默認(rèn)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服務(wù)
vi /lib/systemd/system/kubelet.service
添加如下內(nèi)容:
[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
- 啟動Kubelet
啟動之前要先關(guān)閉swap
swapoff -a
systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet
4. 啟動kube-proxy組件
kube-proxy: 實現(xiàn)了Service的代理與軟件模式的負(fù)載均衡器鳖目。創(chuàng)建了service得pods,此組件決定由哪個pod進(jìn)行服務(wù)缤弦。
- 創(chuàng)建kube-proxy配置文件
vi /opt/kubernetes/cfg/kube-proxy
添加如下內(nèi)容领迈,注意替換<NODE_IP>和<MASTER_IP>:
# 啟用日志標(biāo)準(zhǔn)錯誤
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志級別
KUBE_LOG_LEVEL="--v=4"
# 自定義節(jié)點(diǎn)名稱
NODE_HOSTNAME="--hostname-override=<NODE_IP>"
# API服務(wù)地址
KUBE_MASTER="--master=http://<MASTER_IP>:8080"
- 注冊systemd服務(wù)
vi /lib/systemd/system/kube-proxy.service
添加如下內(nèi)容:
[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
- 啟動kube-proxy
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
5. 查看服務(wù)啟動情況
ps aux |grep kube
可以看到兩個組件得啟動詳情如下:
三:查看集群狀態(tài)
在master節(jié)點(diǎn)執(zhí)行如下命令:
- 將可執(zhí)行文件添加到系統(tǒng)變量,方便使用
echo "export PATH=$PATH:/opt/kubernetes/bin" >> /etc/profile
source /etc/profile
- 查看集群節(jié)點(diǎn)
kubectl get node
顯示如下:
image.png
四:增加新節(jié)點(diǎn)到集群
至此碍沐,已經(jīng)完成了雙節(jié)點(diǎn)搭建狸捅。第三個node節(jié)點(diǎn)得搭建參考前面node節(jié)點(diǎn)搭建。
只需修改kubelet配置文件中的--address和--hostname-override選項為本機(jī)IP累提。
五: 進(jìn)階
以上3節(jié)點(diǎn)部署只是非吵竞龋基礎(chǔ)得版本,還有許多待改進(jìn)得地方:
- etcd&apiserver集群模式
- Flannel網(wǎng)絡(luò)部署:當(dāng)我們啟動 Docker 后會有一個用于和容器進(jìn)行交互的 IP 地址斋陪,如果不去管理的話可能這個 IP 地址在各個機(jī)器上是一樣的朽褪,并且僅限于在本機(jī)上進(jìn)行通信,無法訪問到其他機(jī)器上的 Docker 容器无虚。Flannel 的目的就是為集群中的所有節(jié)點(diǎn)重新規(guī)劃 IP 地址的使用規(guī)則缔赠,從而使得不同節(jié)點(diǎn)上的容器能夠獲得同屬一個內(nèi)網(wǎng)且不重復(fù)的 IP 地址,并讓屬于不同節(jié)點(diǎn)上的容器能夠直接通過內(nèi)網(wǎng) IP 通信友题。
下一章將介紹初步使用k8s
http://www.reibang.com/p/bc015e562b16
注意事項:
- master節(jié)點(diǎn)上得etcd和apiserver啟動順序有要求:先啟動etcd再啟動apiserver