iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 15
1
Kubernetes

在地端建置Angular+ASP.NET Core的DevOps環境系列 第 15

day15_k8s01_kubeadm失敗筆記+文章導讀

這一篇我沒有試成功喔 Orz...

僅供參考

明後兩天會提供有試成功的

(而且很簡單)

===
前言
如果不靠kubeadm的話,請參考Kyle Bai大大的這一篇

Kubernetes v1.11.x HA 全手動苦工安裝教學(TL;DR)
https://kairen.github.io/2018/07/09/kubernetes/deploy/manual-v1.11/
才可以真正學到更多k8s的基礎

===

體會過docker的美好之後,其實我們的目的都達到了,
在DevOps的CI的部分,我們選擇了gitlab ci,而且全部都用docker

接下來困難的要來囉,k8s有更多網路的設定,我們一起挑戰吧

我發現每次跑完不用專案的「 vagrant + ansible 自動建 k8s cluster 專案」host會留一些東西在

只刪 .vagrant 跟 VirtualBox 的 VM,是刪不乾淨的

比如: /etc/hosts、VirtualBox的虛擬網卡等
所以今天,
我會用 VMWare Fusion 建一個 CPU 給 2核心、2 GB RAM 的 VM,裝 Ubuntu 18.04,
來建 Master Node,一切的實驗就在這台 VM 上。
建議不要用VMWare Fusion的easy install,裝完的VM都會卡卡der~

今天參考:

今天主要是對這篇加註解

(挑戰失敗)

如果怕被誤導的,請看原文

KaiRen's Blog 的「利用 kubeadm 部署 Kubernetes v1.11.x HA 叢集」,搭配k8s官網的文件來實作。
Kyle Bai,2018-07-17(很新呢,讚!)
https://kairen.github.io/2018/07/17/kubernetes/deploy/kubeadm-v1.11-ha/
https://kubernetes.io/docs/setup/
本文會把上述2篇融合,Node資訊完全參照Kyle Bai大大的文章,一些指令的參數用官網文件的來補充

心中的OS:真的要惡補一下網管的基礎了…
Cluster IP CIDR: 10.244.0.0/16
Service Cluster IP CIDR: 10.96.0.0/12
Service DNS IP: 10.96.0.10
DNS DN: cluster.local
Kubernetes API VIP: 172.22.132.9
Kubernetes Ingress VIP: 172.22.132.8 # 如果有用到的話

Node資訊
Hostname, VIP, CPU核心數, Memory
k8s-m1, 172.22.132.10, 2, 2G
k8s-n1, 172.22.132.13, 2, 2G
k8s-n2, 172.22.132.14, 2, 2G

VMWare Fusion Ubuntu 18.04,全部操作用root,所以我的指令都不加sudo囉
正式環境就不能這樣了,k8s就像包含完整的網路環境,自然各種網管設定都要考慮進去

$ passwd root # 變更root密碼
$ su # 切換到root

在挑戰全自動設定前,我們先來挑戰手動建置,邊建置邊學習,否則全自動建置的專案我們也看不懂。
其實我每篇文章都是邊寫邊做,如果有做成功再po出來。

零.事前準備(只是做基本安裝設定,不會遇到困難)
VM剛裝好Ubuntu Desktop 18.04後
1.先改Hostname

# 如果你的命令提示字元長這樣user@Ubuntu$ 就要改一下 Hostname
$ passwd root # 變更root密碼
$ su # 切換到root
$ gedit /etc/cloud/cloud.cfg 
# 找到這一行改成ture    preserve_hostname: true
$ gedit /etc/hostname
# 把你現在的Hostname改成「Node資訊」的Hostname
$ gedit /etc/hosts # 這個是local端的 domain ip 對應檔
# 把你現在的Hostname改成「Node資訊」的Hostname or domain name
$ reboot # 重開機

2.關防火牆(一般剛裝好的ubuntu都沒有啟用firewall服務,這段不用執行)

# 亂槍打鳥…個人平常是用ufw全封鎖
# 
$ systemctl stop firewalld && systemctl disable firewalld # 也不知道這是關哪一個
$ ufw disable # uncomplicated firewall,Ubuntu預設的firewall
$ setenforce 0
$ gedit /etc/selinux/config # Ubuntu不知道預設有沒有selinux...
# SELINUX=disabled
3.封包轉送

$ cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
# 下面bridge iptable預設ubuntu沒有
# net.bridge.gridge-nf-call-ip6tables = 1 # 啟用
# net.bridge.bridge-nf-call-iptables = 1 # 把橋接的ipv4的封包傳給iptables'chains
EOF
$ sysctl -p /etc/sysctl.d/k8s.conf

5.4.關閉SWAP

$ swapoff -a && sysctl -w vm.swappiness=0
$ sed '/swap.img/d' -i /etc/fstab
$ gedit /etc/fstab # 註解掉有SWAP那行

5.安裝Docker
官網說Docker不要裝到最新版,因為他們還沒測試過,我們就裝Docker CE 17.03吧
從Ubuntu的存儲庫安裝Docker:

$ apt-get install curl # 裝一下curl
$ curl -fsSL https://get.docker.com/ | sh
$ apt-get update
$ apt-get install -y docker.io
$ systemctl enable docker && systemctl start docker # 開機自動跑起來
# 如果遇到下列的錯誤
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker
Failed to enable unit: Unit file /etc/systemd/system/docker.service is masked.
$ systemctl unmask docker.service
$ systemctl unmask docker.socket
$ systemctl start docker.service

# 檢查網路服務
$ systemctl list-unit-files | grep docker
$ docker ps -a # 看docker在運行的container

6.安裝kubeadm、kubelet、kubectl (這些版本是相關聯的,升級要小心)
kubeadm:快速建cluster的程式(目前還是測試版喔~)

$ apt-get update && apt-get upgrade # 更新kubeadm
kubelet:每個Node必裝的,用來跑pod、container。

kubectl:用來做k8s cluster通信

$ apt-get update && apt-get install -y apt-transport-https curl
$ 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
# 內容只有一行的話也可以這麼下
# echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list

# 故障排除:
# 如果你加source後,連apt-get update都掛掉了…
# 可能是剛剛加的source(例如:docker、kubernetes)重複了
# gedit /etc/apt/sources.list # 把剛剛加的都刪掉重作

$ apt-get update
$ apt-get install -y kubelet kubeadm kubectl
# 如果上面3個程式,要固定版本號
# $ export KUBE_VERSION="1.11.0"
# $ apt-get update && apt-get install -y kubelet=${KUBE_VERSION}-00 kubeadm=${KUBE_VERSION}-00 kubectl=${KUBE_VERSION}-00

$ apt-mark hold kubelet kubeadm kubectl
裝完kubelet後,kubelet每隔幾秒重新啟動一次,因為它在一個crashloop中等待kubeadm告訴它該做什麼事。

直到初使化Master Node之後kubelet才正常

kubelet restart

$ systemctl daemon-reload
$ systemctl restart kubelet

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

一、先來看這個章節 Bootstrapping Clusters with kubeadm
1.檢查
a.檢查hostname、MAC、UUID必須是不同的

所以建議以後建第2個Node時,你的VM不要用複製的,
我會手動灌3台VM: k8s-m1、k8s-n1、k8s-n2當作source,要練習時copy一份來玩,玩壞了再copy重來
查MAC ip link or ifconfig -a

查UUID sudo cat /sys/class/dmi/id/product_uuid
C9134D56-E771-BEA9-A48B-4D58C6542371

b.須要用到的ports(請參考原文)
為省麻煩的,關掉所有的防火牆

配置Master Node上的kubelet使用的cgroup driver
使用Docker時,kubeadm會自動檢測kubelet的cgroup driver,並設置在/var/lib/kubelet/kubeadm-flags.env

2.使用kubeadm建single Master Cluster,並建Pod network(Pod間可互相溝通)
a.Master Node的預先準備(每個Master Node都要做)
HAProxy (TCP/HTTP reverse proxy、TCP/HTTP Load Balancer)

建立 HAProxy 來提供 Kubernetes API Server 的負載平衡

$ mkdir -p /etc/haproxy/ # -p 就是可以連子目錄一起建
# 新增/etc/haproxy/haproxy.cfg設定檔, 每個Node都要放
# 建議用gedit編輯比較人性
$ cat <<EOF > /etc/haproxy/haproxy.cfg
global
  log 127.0.0.1 local0
  log 127.0.0.1 local1 notice
  tune.ssl.default-dh-param 2048
defaults
  log global
  mode http
  option dontlognull
  timeout connect 5000ms
  timeout client  600000ms
  timeout server  600000ms
listen stats
  bind :9090
  mode http
  balance
  stats uri /haproxy_stats
  stats auth admin:admin123
  stats admin if TRUE
frontend kube-apiserver-https
  mode tcp
  bind :8443 # API Server 的 Proxy
  default_backend kube-apiserver-backend
backend kube-apiserver-backend
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server apiserver1 172.22.132.10:6443 check # master1
  # server apiserver2 172.22.132.11:6443 check # master2,以後有需要再加
  # server apiserver3 172.22.132.12:6443 check # master3
EOF

$ mkdir -p /etc/kubernetes/manifests/ # 放 Static Pod 的 YAML檔
# 新增一個 YAML檔來提供 HAProxy 的 Static Pod 部署
$ cat <<EOF > /etc/kubernetes/manifests/haproxy.yaml
kind: Pod
apiVersion: v1
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/critical-pod: ""
  labels:
    component: haproxy
    tier: control-plane
  name: kube-haproxy # Pod的名稱 
  namespace: kube-system # 如果沒有給namespace,會跑到default
spec:
  hostNetwork: true
  priorityClassName: system-cluster-critical
  containers:
  - name: kube-haproxy
    image: docker.io/haproxy:latest # 1.7-alpine # https://hub.docker.com/_/haproxy/
    resources:
      requests:
        cpu: 100m
    volumeMounts: # 掛載到 Pod
    - name: haproxy-cfg
      readOnly: true
      mountPath: /usr/local/etc/haproxy/haproxy.cfg
  volumes: # 定義 volume
  - name: haproxy-cfg
    hostPath: # 檔案是放在某個 Node,當 Pod 重建後不一定會在同一個 Node,建議用 雲端或私有網路空間
      path: /etc/haproxy/haproxy.cfg # Node的檔案位置
      type: FileOrCreate
EOF

Keepalived

建立 Keepalived 來提供 Kubernetes API Server 的 VIP

# 新增一個 Keepalived YAML檔來
$ cat <<EOF > /etc/kubernetes/manifests/keepalived.yaml
kind: Pod
apiVersion: v1
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/critical-pod: ""
  labels:
    component: keepalived
    tier: control-plane
  name: kube-keepalived
  namespace: kube-system
spec:
  hostNetwork: true
  priorityClassName: system-cluster-critical
  containers:
  - name: kube-keepalived
    image: docker.io/osixia/keepalived:1.4.5 # https://hub.docker.com/r/osixia/keepalived/tags/
    env:
    - name: KEEPALIVED_VIRTUAL_IPS # Keepalived 提供的 VIPs
      value: 172.22.132.9 # Kubernetes API VIP
    - name: KEEPALIVED_INTERFACE # 發的VIPs的網卡
      value: enp3s0
    - name: KEEPALIVED_UNICAST_PEERS # 其他 Keepalived 節點的單點傳播 IP
      value: "#PYTHON2BASH:['172.22.132.10']"
      # value: "#PYTHON2BASH:['172.22.132.10', '172.22.132.11', '172.22.132.12']"
    - name: KEEPALIVED_PASSWORD # Keepalived auth_type 的 Password
      value: d0cker
    - name: KEEPALIVED_PRIORITY # 接手的介面之順序,數字越小,優先順序越高。我們只作1台Master Node
      value: "100"
    - name: KEEPALIVED_ROUTER_ID # Keepalived instance 的識別id
      value: "51"
    resources:
      requests:
        cpu: 100m
    securityContext:
      privileged: true
      capabilities:
        add:
        - NET_ADMIN
EOF

b.initial(初使化)Master Node 1(應該只會建1個吧)
建立 control plane components

$ cat <<EOF > kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.12.1 # 要跟你裝的kubeadm版本一樣
apiServerCertSANs:
- "172.22.132.9" # Kubernetes API VIP
api:
  # 定義在/etc/haproxy/haproxy.cfg的 API Server 的 Proxy 聽的 port
  # API server(跟kubectl CLI溝通)
  controlPlaneEndpoint: "172.22.132.9:8443"
etcd: # cluster的資料庫,分散式鍵值儲存區,用來儲存叢集的狀態(包含:Secrets, ConfigMaps)
  local:
    extraArgs:
      listen-client-urls: "https://127.0.0.1:2379,https://172.22.132.10:2379"
      advertise-client-urls: "https://172.22.132.10:2379"
      listen-peer-urls: "https://172.22.132.10:2380"
      initial-advertise-peer-urls: "https://172.22.132.10:2380"
      initial-cluster: "k8s-m1=https://172.22.132.10:2380"
    serverCertSANs:
      - k8s-m1
      - 172.22.132.10
    peerCertSANs:
      - k8s-m1
      - 172.22.132.10
networking:
  podSubnet: "10.244.0.0/16"
EOF

關鍵步驟

我在這裡就失敗囉,有空再回來挑戰

保險起見,重啟一下kubelet

$ systemctl daemon-reload
$ systemctl restart kubelet

$ kubeadm init --config kubeadm-config.yaml >> ~/init.log # 輸出要保留,kubeadm join會用到

$ netstat -ntlp # 看(control plane components)各項服務有沒有開起來
kube-proxy
kube-scheduler
etcd
kube-controller
haproxy
kubelet
kube-apiserver
kube-proxy

# 查k8s cluster狀態
$ kubectl get nodes 
$ kubectl -n kube-system get pods

匯出k8s-m1的CA、Certs

$ export etcDIR=/etc/kubernetes/
$ export bakDIR=~/Documents/k8s-m1_CA_backup/
$ mkdir -p ~/Documents/k8s-m1_CA_backup/
$ cp ${etcDIR}/pki/ca.crt ${bakDIR}/pki/ca.crt
  cp ${etcDIR}/pki/ca.key ${bakDIR}/pki/ca.key
  cp ${etcDIR}/pki/sa.key ${bakDIR}/pki/sa.key
  cp ${etcDIR}/pki/sa.pub ${bakDIR}/pki/sa.pub
  cp ${etcDIR}/pki/front-proxy-ca.crt ${bakDIR}/pki/front-proxy-ca.crt
  cp ${etcDIR}/pki/front-proxy-ca.key ${bakDIR}/pki/front-proxy-ca.key
  cp ${etcDIR}/pki/etcd/ca.crt ${bakDIR}/pki/etcd/ca.crt
  cp ${etcDIR}/pki/etcd/ca.key ${bakDIR}/pki/etcd/ca.key
  cp ${etcDIR}/admin.conf ${bakDIR}/admin.conf

其他kubeadm init參數:

--pod-network-cidr=10.244.0.0/16 # pod的網段,我們跟官網用一樣的VIP網段
--apiserver-advertise-address= # 通常不用給,預設是用default getway來跟master's IP溝通

kubeadm init 輸出的東西要保留起來

$ kubeadm init --pod-network-cidr=10.244.0.0/16 # 應該會先進行一些檢查,輸出一些資訊到螢幕上

備註:如果要重下kubeadm init,或者哪個步驟做錯,要砍掉k8s cluster的話...

番外篇 tear down K8S cluster

有關drain,可參考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#drain

drain就想像在,要維護node前要下的指令,避免Pod持繼運作之類的

$ kubectl drain <node name> --delete-local-data --force --ignore-daemonsets

如果要再回復到service,可下kubectl uncordon

$ kubectl delete node <node name>

餵給 kubeadm init 的檔案都會刪掉喔,請先備份

/etc/haproxy/haproxy.cfg # 不會刪
/etc/kubernetes/manifests/ # 目錄還在,檔案不見 
$ kubeadm reset # 在要刪除的Node上,重置所有kubeadm安裝狀態
[reset] WARNING: changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] are you sure you want to proceed? [y/N]: y
[preflight] running pre-flight checks
[reset] stopping the kubelet service
[reset] unmounting mounted directories in "/var/lib/kubelet"
[reset] deleting contents of stateful directories: [/var/lib/kubelet /etc/cni/net.d /var/lib/dockershim /var/run/kubernetes /var/lib/etcd]
[reset] deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]

如果kubectl不是用root執行

$ mkdir -p $HOME/.kube # 建目錄
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # copy設定檔
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config # 改權限
如果kubectl是用root執行

$ export KUBECONFIG=/etc/kubernetes/admin.conf # 直接用/etc/...的設定檔
接下來,

kubeadm init 會輸出 kubeadm join 的指令,我們用這個指令來把node加到cluster

$ kubeadm token # master node跟worker node互相驗證用的token

c.建立Pod Network Add-on(附加組件)
當Master Node都完成部署後(我們只建1個)

接著要在此 Kubernetes 部署 Pod Network Plugin,
一樣用KaiRen大大的設定,
用 CoreOS Flannel 來提供簡單 Overlay Network 來讓 Pod 中的容器能夠互相溝通:

$ wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
# 確認設定無誤後
$ kubectl apply -f kube-flannel.yml
clusterrole "flannel" created
clusterrolebinding "flannel" created
serviceaccount "flannel" configured
configmap "kube-flannel-cfg" configured
daemonset "kube-flannel-ds" configured

若參數 --pod-network-cidr=10.244.0.0/16 改變時,在kube-flannel.yml檔案也需修改net-conf.json欄位的 CIDR。
若使用 Virtualbox 的話,要修改kube-flannel.yml中的 command 綁定 iface,如command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=eth1" ]

確認Pod Network狀態

$ kubectl -n kube-system get po -l app=flannel -o wide
$ ip -4 a show flannel.1
$ route -n

CoreDNS將不會在安裝網絡之前啟動。
kubeadm只支援container network interface(CNI),不支持kubenet
kubeadm預設是用RBAC權限管理模型(Role-Based Access Control)
因為我們都在VM裡面跑,應該不用考慮實體的網路設備支援性問題,
如果你們要佈置在實體環境,設備採購上可能要考慮到。

我先選Flannel來試看看,如果你要用其他的請參考官網文件

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml # 加pod network
$ kubectl get pods --all-namespaces # 檢查CoreDNS pod是否正常運行

如果有錯誤,就要參考
https://kubernetes.io/docs/setup/independent/troubleshooting-kubeadm/
基於安全因素,通常不在 Master Node 跑 container
女王蜂(Master Node)是不工作的,工作(container)由工蜂(Worker Node)負責,
養蜂養得好才能獲得優質的「蜂蜜」

d.加入Worker Node()
Worker Node也要做「零.事前準備」,您應該已經裝好kubeadm、kubelet了

# 放 Pod YAML 檔
$ mkdir -p /etc/kubernetes/manifests/
SSH到準Worker Node(也要裝docker、kubeadm)
$ sudo su - # 轉換身份為root
# 跑步驟b中,Master Node執行kubeadm init所顯示的指令
$ kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
大概長這樣
$ kubeadm join 172.22.132.9:8443 \
--token t4zvev.8pasuf89x2ze8htv \
--discovery-token-ca-cert-hash sha256:19c373b19e71b03d89cfc6bdbd59e8f11bd691399b38e7eea11b6043ba73f91d
加完後回 k8s-m1看有沒有加成功
root@k8s-m1$ kubectl get nodes # 檢查 Node 狀態
root@k8s-m1$ kubectl get cs # 檢查元件狀態
# 測試是否可以建立 Pod
# Pod 會被分到 Worker Node 進行,每個 Pod 中含有1~n個 container
root@k8s-m1$ kubectl run nginx --image nginx --restart=Never --port 80 # 開 Pod
# --type NodePort,如果沒有指定,預設是 ClusterIP 型態,只有 cluster內部能存取
root@k8s-m1$ kubectl expose pod nginx --port 80 --type NodePort # 指定 Service 型態 # 開 Service
root@k8s-m1$ kubectl get po,svc 

# 外部需要透過 Service Object 連到 Pod 
$ curl 712.22.132.10:xxxx # 試試 NGINX 服務

上面的 kubectl expose pod nginx ...... 也可以寫成yaml,再用 kubectl apply -f serviceNginx.yaml 建 Service

# serviceNginx.yaml
---
apiVersion: v1
kind: Service
metadata:
 name: serviceNginx
spec:
 type: NodePort
 selector:
  app: nginx
 ports:
  - protocol: TCP
   port: 80
$ kubectl apply -f serviceNginx.yaml
$ kubectl get services

k8s 會分配一個 port 供 serviceNginx使用(不是80port喔),所有的Worker Node的這個port就會對應到serviceNginx
而 Servcie 跟 Pod 是靠 Label 跟 Selector 來識別

如果之前的 token 沒有記下來,可回Master Node下指令

$ kubeadm token list # token的時效為24小時
$ kubeadm token create # 取得新token
# 長得像這樣 5didvk.d09sbcov8ph2amjw
一樣在Master Node可取得自簽憑證 (的sha256的hash值的16進位格式)

# 同一行指令喔
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'
# 長得像這樣 8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78
$ kubectl get nodes # 如果加成功,在Master Node下這個指令,就能看到剛剛的Worker Node

d.從Master Node以外的電腦,操控cluster(非必需) 沒實驗喔,有興趣的自己試
如果是用root帳號

$ scp root@<master ip>:/etc/kubernetes/admin.conf . # 從Master Node複製admin.conf
$ kubectl --kubeconfig ./admin.conf get nodes # 多餵個admin.conf
# 由此可知有admin.conf者,得cluster的super user權限

# 由於admin.conf權限太大,建議改給KubeConfig文件,這個指令還在alpha階段喔
# https://www.mankier.com/1/kubeadm-alpha-phase-kubeconfig-user
$ kubeadm alpha phase kubeconfig user --client-name <CN>
$ kubectl create (cluster)rolebinding # 為特定的ClusterRole建ClusterRoleBinding

e.從Master Node以外的電腦,使用API Server(非必需)
使用指令 kubectl proxy

$ scp root@<master ip>:/etc/kubernetes/admin.conf .
$ kubectl --kubeconfig ./admin.conf proxy

然後試看看 http://localhost:8001/api/v1

f.如果上述都成功,可以考慮用「dashboard」
https://github.com/kubernetes/dashboard#kubernetes-dashboard

我猜應該是在 Master Node下的吧…

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

然後在其他電腦用kubectl proxy,應該就能享用dashboard囉

$ kubectl proxy

==實作已結束==我是分隔線===
===以下是官網文件補充======

二、Kubelet configuration patterns
參考:https://kubernetes.io/docs/setup/independent/kubelet-integration/
kubeadm init跟kubeadm join的一些參數、設定檔,以後有需要再補上

$ kubeadm init --service-cidr 10.96.0.0/12 # --pod-network-cidr=10.244.0.0/16
               --cluster-dns  # 設定kubelet使用的DNS地址

將新設定套到kubelet,
kubeadm會寫入 /etc/kubernetes/bootstrap-kubelet.conf,
包含:CA憑證、Bootstrap Token
$ systemctl daemon-reload && systemctl restart kubelet
備註:

用於TLS Bootstrap的是/etc/kubernetes/bootstrap-kubelet.conf,只有在/etc/kubernetes/kubelet.conf不存在時使用

unique kubelet identity 寫在 /etc/kubernetes/kubelet.conf
kubelet相關的元件設定 寫在 /var/lib/kubelet/config.yaml
動態環境參數 KUBELET_KUBEADM_ARGS 的來源是 /var/lib/kubelet/kubeadm-flags.env

三、使用kubeadm建立高度可用(hight available)的cluster
參考:https://kubernetes.io/docs/setup/independent/high-availability/

官網文件提供2種方法,我們選比較簡單的方法來實作
這2種方式都無法提供 LoadBalancer類型的Service Object、動態PersistentVolumes(ex:GCE PV,Azure PV)
control panel或etcd node上的所有 指令 都要用 root 執行

假設 pod CIDR 是 --pod-network-cidr=10.244.0.0/16

設定SSH,請參考「02 補充說明:SSH設定」

$ eval $(ssh-agent)
$ ssh-add ~/.ssh/path_to_private_key
$ eval $(ssh-agent)
$ ssh -A 10.0.0.7
$ sudo -E -s

其他指令
kubectl

$ kubectl config current-context # 正在管理的cluster
$ kubectl get pods [pod name] -o jsonpath --template={.status.podIP} # 查 Pod 的 IP

上一篇
day14_Ansible02_playbook
下一篇
day16_k8s02_用kubeadm建k8s cluster
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31

尚未有邦友留言

立即登入留言