系列導航
- Istio Mixer Adapter開發 (一)K8S環境搭建
- Istio Mixer Adapter開發 (二)Istio環境搭建
- Istio Mixer Adapter開發 (三)自定義Mixer Grpc Adapter部署
概述
由於Kubernetes(後面簡稱K8S)本身是一個非常複雜的容器管理平臺/容器編排系統,本文重點是講述Istio Mixer介面卡元件的開發,在這裡我們僅以最簡單的方式(使用kubeadm安裝一個本地K8S環境)搭建一個K8S叢集作為我們部署研究Istio的基礎環境
對於Istio,筆者在這裡做了一個假設,就是讀者均已瞭解Service Mesh,Istio的基本原理與架構,Istio與Kubernetes的關係,Istio與Service Mesh的關係,這裡除有必要部分,不會詳細闡述其更多詳細功能特性
常用工具安裝
安裝zsh,參考下面網站
ohmyz.sh/
root@worker05:~# apt install zsh -y
root@worker05:~# sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
➜ ~ vim .zshrc
ZSH_THEME="agnoster"
plugins=(kubectl)
source <(kubectl completion zsh)
複製程式碼
安裝kubeadm,docker元件
安裝kubeadm,docker
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
$ cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
$ apt-get update
$ apt-get install -y docker.io
$ apt remove kubelet kubectl kubeadm
$ apt install kubelet=1.11.3-00
$ apt install kubectl=1.11.3-00
$ apt install kubeadm=1.11.3-00
複製程式碼
部署 Kubernetes 的 Master 節點
首先編寫一個kubeadm的安裝描述檔案kubeadm.yaml
➜ kubeadm vi kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
controllerManagerExtraArgs:
horizontal-pod-autoscaler-use-rest-clients: "true"
horizontal-pod-autoscaler-sync-period: "10s"
node-monitor-grace-period: "10s"
apiServerExtraArgs:
runtime-config: "api/all=true"
kubernetesVersion: "stable-1.11"
複製程式碼
執行kubeadm init初始化K8S叢集
➜ kubeadm init --config kubeadm.yaml
複製程式碼
過程中出現一些錯誤,按照提示解決即可,如筆者遇到的問題用下面兩個命令可以解決
➜ kubeadm systemctl enable docker.service
➜ kubeadm swapoff -a
複製程式碼
重新執行init操作,若看到如下提示說明init master成功,並提示了加入叢集的命令,把他記錄下來
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.101.6:6443 --token 0ha4j0.g61yo2fbbtqorfd3 --discovery-token-ca-cert-hash sha256:502af619f2997ac5cdbc7a54cd01f9a2fac3bdcd7a9f0d15c588cf1aec3aa67d
複製程式碼
執行提示的命令,使本地的kubectl生效
➜ ~ mkdir -p $HOME/.kube
➜ ~ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
➜ ~ sudo chown $(id -u):$(id -g) $HOME/.kube/config
➜ ~ kubectl get nodes
NAME STATUS ROLES AGE VERSION
worker05 NotReady master 3m v1.11.3
複製程式碼
通過命令列輸出我們可以看到節點狀態的NotReady,檢視NotReady的原因
➜ ~ kubectl describe node worker05
...
Conditions:
Ready False Tue, 19 Feb 2019 08:11:20 +0000 Tue, 19 Feb 2019 08:07:26 +0000 KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
...
複製程式碼
意思是我們沒部署任何K8S網路外掛,使用下述命令部署網路外掛
➜ ~ kubectl apply -f https://git.io/weave-kube-1.6
複製程式碼
再次檢視節點狀態,已經可以了
➜ ~ kubectl get nodes
NAME STATUS ROLES AGE VERSION
worker05 Ready master 10m v1.11.3
複製程式碼
這裡我們的master節點就建立好了,但是,預設k8s的排程策略是不會向master節點排程pods的,原因是預設master節點上會有“汙點”,使排程程式排程pod的時候會繞開帶有“汙點”的節點,我們要做一點特殊設定,去掉這個“汙點”
使用如下命令
➜ ~ kubectl describe node worker05
...
Taints: node-role.kubernetes.io/master:NoSchedule
...
# 我們把這個“汙點”去掉,就可以讓k8s的排程系統排程pod到master節點上了
➜ ~ kubectl taint nodes --all node-role.kubernetes.io/master-
node/worker05 untainted
複製程式碼
接下來我們為這個K8S叢集部署一個Dashboard視覺化外掛
➜ ~ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
複製程式碼
注意部署好的dashboard應用是無法直接被叢集外訪問的,我們要為其指定型別為NodePort的Service是叢集外可以通過節點IP+NodePort埠的方式訪問叢集內的服務,如下所示:
➜ ~ kubectl edit svc kubernetes-dashboard -n kube-system
...
type: NodePort #將ClusterIP修改成NodePort
...
複製程式碼
參考官方文件為該dashboard應用建立使用者及token
複製輸出當中的token
➜ kubedash kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
➜ kubedash kubectl get svc --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 50m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 50m
kube-system kubernetes-dashboard NodePort 10.111.245.181 <none> 443:31100/TCP 34m
複製程式碼
通過上述命令輸出的埠號 + 節點ip(https://192.168.101.6:31100)即可從叢集外訪問Kubernetes dashboard
如圖所示:
至此我們的K8S單節點叢集已經搭建好並安裝好了dashboard元件,並配置了叢集外訪問的方式,為下一步部署Istio打下了基礎