Kubernetes叢集部署核心步驟
目錄
- 前言
- 一、所有節點安裝docker
- 二、所有節點安裝kubeadm
- 三、安裝master節點
- 四、部署網路外掛
- 五、安裝node節點
- 六、執行一個demo
前言
這裡使用環境:Ubuntu 18.04,以下所有操作都在root使用者下進行
其實kubenetes安裝非常核心的幾步就是
- 安裝docker
- 安裝kubeadm
- 通過kubeadm init建立master節點
- 安裝master的網路外掛
- 通過kubeadm join新增node節點
一、所有節點安裝docker
export LC_ALL=C apt-get -y autoremove docker docker-engine docker.io docker-ce apt-get update -y apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ software-properties-common curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" apt-get update -y # docker源加速 mkdir -p /etc/docker echo '{"registry-mirrors":["https://pee6w651.mirror.aliyuncs.com"]}' > /etc/docker/daemon.json # 安裝docker apt-get install docker.io -y # 啟動和自啟動 systemctl start docker systemctl enable docker
二、所有節點安裝kubeadm
apt-get update && apt-get install -y apt-transport-https curl curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - #配置kubernetes阿里源 tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF' deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl # 設定停止自動更新 apt-mark hold kubelet kubeadm kubectl # kubelet開機自啟動 systemctl enable kubelet && systemctl start kubelet
安裝了kubeadm, kubelet、kubectl、kubernetes-cni都會被安裝好
三、安裝master節點
安裝命令如下:
kubeadm init --kubernetes-version=v1.11.3 --apiserver-advertise-address 172.18.0.1 --pod-network-cidr=10.244.0.0/16
說明
--kubernetes-version: 用於指定 k8s版本
--apiserver-advertise-address:用於指定使用 Master的哪個network interface進行通訊,若不指定,則 kubeadm會自動選擇具有預設閘道器的 interface
--pod-network-cidr:用於指定Pod的網路範圍。該引數使用依賴於使用的網路方案,本文將使用經典的flannel網路方案。
這裡執行報錯
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
我們根據提示加上--ignore-preflight-errors=all,再次執行
kubeadm init --kubernetes-version=v1.11.3 --apiserver-advertise-address 172.18.0.1 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=all```
如果沒有FQ的同學可能會遇到拉不下映象來的情況,可以通過下面命令解決
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.11.3
docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.11.3
docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.11.3
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.11.3
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd-amd64:3.2.18
docker pull coredns/coredns:1.1.3
拉完後,再tag為我們需要的映象
docker tag docker.io/mirrorgooglecontainers/kube-proxy-amd64:v1.11.3 k8s.gcr.io/kube-proxy-amd64:v1.11.3
docker tag docker.io/mirrorgooglecontainers/kube-scheduler-amd64:v1.11.3 k8s.gcr.io/kube-scheduler-amd64:v1.11.3
docker tag docker.io/mirrorgooglecontainers/kube-apiserver-amd64:v1.11.3 k8s.gcr.io/kube-apiserver-amd64:v1.11.3
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager-amd64:v1.11.3 k8s.gcr.io/kube-controller-manager-amd64:v1.11.3
docker tag docker.io/mirrorgooglecontainers/etcd-amd64:3.2.18 k8s.gcr.io/etcd-amd64:3.2.18
docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag docker.io/coredns/coredns:1.1.3 k8s.gcr.io/coredns:1.1.3
安裝成功後會出現kubeadm join --token...
,這個命令就是我們用來新增節點的命令,得記錄下來
kubeadm join 172.18.0.1:6443 --token 9fvv8z.7vmiehcohwlll9tj --discovery-token-ca-cert-hash sha256:dc583faabe8bc130137507cca893fbead73a8879e5540545f2122f9a0839d6dc
還會出現第一次使用叢集的配置命令,用來將k8s叢集的配置命令儲存在使用者的.kube目錄,kubectl預設會使用這個目錄授權資訊訪問k8s叢集
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
根據提示執行這三條指令,這時kubectl就可以正常的執行了,我們使用kubectl get nodes來檢視一下節點資訊
root@VM-0-8-ubuntu:/home/ubuntu# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm-0-8-ubuntu NotReady master 6m v1.11.3
顯示master節點是NotReady,這是因為我們還沒有安裝網路外掛,可以通過kubectl describe node
命令驗證
root@VM-0-8-ubuntu:/home/ubuntu# kubectl describe node vm-0-8-ubuntu
...
ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
提示網路外掛未就緒
再檢視一下k8s預設的kube-system保留名稱空間的內容
root@VM-0-8-ubuntu:/home/ubuntu# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-78fcdf6894-vb9pv 0/1 Pending 0 7m
coredns-78fcdf6894-zlkfp 0/1 Pending 0 7m
etcd-vm-0-8-ubuntu 1/1 Running 0 6m
kube-apiserver-vm-0-8-ubuntu 1/1 Running 1 7m
kube-controller-manager-vm-0-8-ubuntu 1/1 Running 2 8m
kube-proxy-jcfpt 1/1 Running 0 7m
kube-scheduler-vm-0-8-ubuntu 1/1 Running 0
coredns處於pending狀態
四、部署網路外掛
kubernetes預設支援多重網路外掛如flannel、weave、calico,
這裡使用flanne,就必須要設定--pod-network-cidr引數,10.244.0.0/16是kube-flannel.yml裡面配置的預設網段,如果需要修改的話,需要把kubeadm init的--pod-network-cidr引數和後面的kube-flannel.yml裡面修改成一樣的網段就可以了
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
安裝完成,再次檢視node狀態
root@VM-0-8-ubuntu:/home/ubuntu# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm-0-8-ubuntu Ready master 9m v1.11.3
再看master節點,已經變成Ready,再看kube-system的pod
root@VM-0-8-ubuntu:/home/ubuntu# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-78fcdf6894-fndmg 1/1 Running 0 2m
coredns-78fcdf6894-nm282 1/1 Running 0 2m
etcd-vm-0-8-ubuntu 1/1 Running 0 2m
kube-apiserver-vm-0-8-ubuntu 1/1 Running 0 1m
kube-controller-manager-vm-0-8-ubuntu 1/1 Running 0 1m
kube-flannel-ds-85wxw 1/1 Running 0 22s
kube-proxy-95v4f 1/1 Running 0 2m
kube-scheduler-vm-0-8-ubuntu 1/1 Running 0
coredns也正常了
預設情況master節點打上了“汙點”,使用的是k8s的Taint/Toleration機制,如下
root@VM-0-8-ubuntu:/home/ubuntu# kubectl describe node vm-0-8-ubuntu
...
Taints: node-role.kubernetes.io/master:NoSchedule
如果我們只是需要一個單節點,可以刪除這個Taints
root@VM-0-8-ubuntu:/home/ubuntu# kubectl taint nodes --all node-role.kubernetes.io/master-
node/vm-0-8-ubuntu untainted
五、安裝node節點
master和node節點都執行著kubectl,唯一不同的是master需要init,啟動kube-apiserver、kube-scheduler、kube-controller-manager這三個系統Pod,
在安裝完docker和kubeadm的基礎上,只需要執行kubeadm join命令就可以了
kubeadm join 172.18.0.1:6443 --token 9fvv8z.7vmiehcohwlll9tj --discovery-token-ca-cert-hash sha256:dc583faabe8bc130137507cca893fbead73a8879e5540545f2122f9a0839d6dc
六、執行一個demo
建立一個demo.yaml,我們使用nginx:alpine映象
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
執行建立
root@VM-0-8-ubuntu:/home/ubuntu# kubectl apply -f demo.yaml
deployment.apps/hello-deployment created
檢視pod
root@VM-0-8-ubuntu:/home/ubuntu# kubectl get po
NAME READY STATUS RESTARTS AGE
demo-deployment-555958bc44-drwvh 1/1 Running 0 26s
demo-deployment-555958bc44-llhr9 1/1 Running 0 26s