天天看點

通過kubeadm部署kubernetes叢集

目錄

    • Version
    • 安裝 Docker
    • 安裝 Kubeadm
      • 設定 kubectl 指令自動補全
      • 關閉swap
    • 部署 Kubernetes 的 Master 節點
      • 安裝網絡插件:weave
      • 确認 pod 狀态
      • 檢查node狀态
    • 部署 Kubernetes 的 Worker 節點
    • 部署 Kubernetes Dashboard (Master節點)
      • 準備 dashboard 鏡像
      • 下載下傳并編輯 kubernetes-dashboard.yaml
      • 做如下修改
      • 建立 dashboard
      • 檢視 dashboard pod 狀态
      • 建立一個管理者使用者
      • 建立admin-user
      • 擷取管理者使用者的Token
      • 添加Token至kubeconfig檔案
      • 導入kubeconfig檔案
    • 部署容器存儲插件:Rook (Master節點)
      • 建立 Rook operator
      • 建立 Rook Cluster

Version

  • OS: ubuntu 18.04 64bit
  • docker: 18.06.1
  • kubeadm: 1.12.2-00
  • kubectl: 1.12.2-00
  • kubelet: 1.12.2-00
  • kubernetes: v1.12.2
  • dashboard: v1.10.0
  • weave: 2.5.0
  • pause: 3.1
  • coredns: 1.2.2
  • etcd: 3.2.24
注:需要在每台服務(所有的 master 和 worker 節點)器上安裝:
  • docker
  • kubeadm
  • kubelet
  • kubectl

安裝 Docker

apt-get install -y apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

apt-get update

// 安裝指定版本的docker-ce
// 查詢可用版本:apt-cache madison docker-ce
apt-get install -y docker-ce=18.06.1~ce~3-0~ubuntu

           

安裝 Kubeadm

// https://kubernetes.io/docs/setup/independent/install-kubeadm/

apt-get update && apt-get install -y apt-transport-https curl
px 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 https://apt.kubernetes.io/ kubernetes-xenial main
EOF
px apt-get update
px apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
           

或者使用

aliyun

kubernetes

// 增加kubernetes aliyun鏡像源
apt-get update && apt-get install -y apt-transport-https curl

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

apt-get update

apt-get install -y kubeadm=1.12.2-00 kubectl=1.12.2-00 kubelet=1.12.2-00

apt-mark hold kubelet kubeadm kubectl
           

在上述安裝 kubeadm 的過程中,

kubeadm

kubectl

kubelet

kubernetes-cni

這幾個二進制檔案都會被自動安裝好。

dpkg -l |grep kube
hi  kubeadm                               1.12.2-00                          amd64        Kubernetes Cluster Bootstrapping Tool
hi  kubectl                               1.12.2-00                          amd64        Kubernetes Command Line Tool
hi  kubelet                               1.12.2-00                          amd64        Kubernetes Node Agent
ii  kubernetes-cni                        0.6.0-00                           amd64        Kubernetes CNI
           

設定 kubectl 指令自動補全

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
           

關閉swap

swapoff -a
           

部署 Kubernetes 的 Master 節點

參考筆記:kubeadm init 時異常
kubeadm init --kubernetes-version=v1.12.2
           
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/
  
// 注:參考“安裝網絡插件:weave”這一小節
  
You can now join any number of machines by running the following on each node
as root:

 kubeadm join 192.168.3.200:6443 --token 02x9mf.bqmy6orso9ka4xj9 --discovery-token-ca-cert-hash sha256:1dde890e407fcfdbbd54ee889a969b67a4a9650ee0a49b02d0aa41bb4d404213
           

安裝網絡插件:weave

參考weave文檔

安裝指令:

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
           

也可以先将檔案内容儲存到

/etc/kubernetes/weave.conf

,然後在用如下方式安裝:

// setup 1
wget -O /etc/kubernetes/weave.conf "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

// setup 2
kubectl apply -f /etc/kubernetes/weave.conf

           

确認 pod 狀态

kubectl get pod --all-namespaces
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-576cbf47c7-cb6pb             1/1     Running   0          9m22s
kube-system   coredns-576cbf47c7-sh82r             1/1     Running   0          9m22s
kube-system   etcd-k8s-master                      1/1     Running   0          72s
kube-system   kube-apiserver-k8s-master            1/1     Running   0          73s
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          72s
kube-system   kube-proxy-6682z                     1/1     Running   0          9m22s
kube-system   kube-scheduler-k8s-master            1/1     Running   0          66s
kube-system   weave-net-cnrqv                      2/2     Running   0          100s
           

檢查node狀态

kubectl get node
NAME         STATUS   ROLES    AGE     VERSION
k8s-master   Ready    master   8m14s   v1.12.2
           

部署 Kubernetes 的 Worker 節點

和Master節點的差別在于:在 kubeadm init 的過程中kubelet 啟動後,Master 節點上還會自動運作kube-apiserver、kube-scheduler、kube-controller-manger 這三個系統 Pod。

部署 worker 節點:

第一步:在所有 Worker 節點上執行

安裝 Docker

安裝 Kubeadm

兩個小節的所有步驟。

第二步:執行部署 Master 節點時生成的 kubeadm join 指令:

kubeadm join 192.168.3.200:6443 --token 02x9mf.bqmy6orso9ka4xj9 --discovery-token-ca-cert-hash sha256:1dde890e407fcfdbbd54ee889a969b67a4a9650ee0a49b02d0aa41bb4d404213
           

此時,在 master 節點上檢視節點狀态

kubectl get node
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   55m   v1.12.2
k8s-node01   Ready    <none>   93s   v1.12.2
           

部署 Kubernetes Dashboard (Master節點)

準備 dashboard 鏡像

docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.0
docker tag mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.0 docker image rm mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.0
           

下載下傳并編輯 kubernetes-dashboard.yaml

cd /etc/kubernetes
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

vim kubernetes-dashboard.yaml
           

做如下修改

// 一, 配置鏡像拉取政策:
...
        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0
        imagePullPolicy: Never  // new add
...

// 二,配置端口 
// Service部分
spec:
  type: NodePort  // new add
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001  // new add
           

建立 dashboard

kubectl apply -f kubernetes-dashboard.yaml
           

檢視 dashboard pod 狀态

kubectl -n kube-system get pod
           

建立一個管理者使用者

建立檔案:/etc/kubernetes/kubernetes-dashboard-adminUser.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system

---

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
           

建立admin-user

kubectl create -f kubernetes-dashboard-adminUser.yaml
           

擷取管理者使用者的Token

kubectl describe  secret admin-user --namespace=kube-system
           

添加Token至kubeconfig檔案

vim ~/.kube/config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: xxxxxxxx
    server: https://192.168.3.200:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: [email protected]
current-context: [email protected]
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: xxxxxxxx
    client-key-data: xxxxxxxx
    token: xxxxxxxx  // new add
           

導入kubeconfig檔案

浏覽器通路:https://192.168.3.200:30001,導入配置檔案: ~/.kube/config 即可。

至此,kubernetes dashboard 配置完成。

部署容器存儲插件:Rook (Master節點)

Rook 項目是一個基于 Ceph 的 Kubernetes 存儲插件。具有水準擴充、遷移、災難備份、監控等大量的企業級功能,這使得這個項目變成了一個完整的、生産級别可用的容器存儲插件。

建立 Rook operator

kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
           

等待 rook-ceph-system 命名空間的所有Pod變為Running狀态

// kubectl get namespaces

kubectl -n rook-ceph-system get pod
NAME                                  READY   STATUS    RESTARTS   AGE
rook-ceph-agent-m7dwt                 1/1     Running   0          18s
rook-ceph-operator-7bbc5b99b8-hbnpd   1/1     Running   0          105s
rook-discover-4lj8m                   1/1     Running   0          18s
           

建立 Rook Cluster

kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml
           

确認結果

// kubectl get namespaces

kubectl -n rook-ceph get pod
NAME                                     READY   STATUS      RESTARTS   AGE
rook-ceph-mgr-a-558fbdbb5-8zcdf          1/1     Running     0          3m29s
rook-ceph-mon-a-6c9c4f85cb-7fj2g         1/1     Running     0          4m8s
rook-ceph-mon-b-845976fccc-2gg67         1/1     Running     0          3m57s
rook-ceph-mon-c-5fd6678f46-ffdfr         1/1     Running     0          3m42s
rook-ceph-osd-0-6c7fbc859b-jv6qc         1/1     Running     0          3m7s
rook-ceph-osd-prepare-k8s-node01-6x4sb   0/2     Completed   0          3m19s
           
Rook 将自己的 Pod 都放在由它自己管理的 Namespace 中。

至此,基于Rook 的持久化存儲叢集部署完成。

之後在 Kubernetes 上建立的所有 Pod 就能夠通過 PV 和 PVC 的方式在容器裡挂載由 Ceph 提供的資料卷了。

Rook 項目會負責這些資料卷的生命周期管理、災難備份等運維工作。

END.

繼續閱讀