Istio Mixer Adapter開發 (一)K8S環境搭建

I'm Robin發表於2019-02-19

系列導航

概述

由於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

github.com/kubernetes/…

複製輸出當中的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
如圖所示:

Istio Mixer Adapter開發 (一)K8S環境搭建

至此我們的K8S單節點叢集已經搭建好並安裝好了dashboard元件,並配置了叢集外訪問的方式,為下一步部署Istio打下了基礎

相關文章