Kubernetes(一) 跟著官方文檔從零搭建K8S

  • 2019 年 12 月 20 日
  • 筆記

.example_responsive_1 { width: 200px; height: 50px; } @media(min-width: 290px) { .example_responsive_1 { width: 270px; height: 50px; } } @media(min-width: 370px) { .example_responsive_1 { width: 339px; height: 50px; } } @media(min-width: 500px) { .example_responsive_1 { width: 468px; height: 50px; } } @media(min-width: 720px) { .example_responsive_1 { width: 655px; height: 50px; } } @media(min-width: 800px) { .example_responsive_1 { width: 728px; height: 50px; } } (adsbygoogle = window.adsbygoogle || []).push({});

Kubernetes(一) 跟著官方文檔從零搭建K8S

目錄

Kubernetes教程之跟著官方文檔從零搭建K8S 文章地址: https://blog.piaoruiqing.com/2019/09/17/kubernetes-1-installation/

前言

本文將帶領讀者一起, 參照著Kubernetes官方文檔, 對其安裝部署進行講解. Kubernetes更新迭代很快, 書上、網上等教程可能並不能適用於新版本, 但官方文檔能.

閱讀這篇文章你能收穫到:

  • 如何閱讀Kubernetes官方安裝指南並搭建一個Kubernetes環境.
  • Kubernetes安裝過程中的注意事項.
  • 避過常見的坑.

閱讀本文你需要:

  • 熟悉Linux命令.
  • 知道Kubernetes是用來幹什麼的 (不然裝它幹啥(ಥ_ಥ)).
  • 知道Docker

器材準備

文檔鏈接: Before you begin

序號

名稱

數量

備註

1

伺服器

2

作業系統: Linux(centos7, 其它作業系統也可, 安裝過程類似, 可參考官方文檔) 機器配置: CPU >= 2, 記憶體 >= 2G

官網找到kubeadm安裝文檔入口, 文檔很詳細. 英文閱讀沒有障礙的讀者推薦直接查看英文文檔, 中文文檔不全且更新不及時安裝時可能存在問題.

前期準備

筆者已經預先安裝好了兩台虛擬機, centos7(CPUx2, 記憶體2.5G). 並在路由器上固定了這兩個虛擬機的IP地址.

修改hostname

[root@k8s-master ~]$ vim /etc/hostname # 修改hostname  [root@k8s-master ~]$ vim /etc/hosts # 將本機IP指向hostname  [root@k8s-master ~]$ reboot -h      # 重啟(可以做完全部前期準備後再重啟)

修改後, 兩台虛擬機的配置如下:

# in k8s-master  [root@k8s-master ~]$ cat /etc/hostname  k8s-master  [root@k8s-master ~]$ cat /etc/hosts | grep k8s  10.33.30.92 k8s-master  10.33.30.91 k8s-worker    # in k8s-worker  [root@k8s-worker ~]$ cat /etc/hostname  k8s-worker  [root@k8s-worker ~]$ cat /etc/hosts | grep k8s  10.33.30.92 k8s-master  10.33.30.91 k8s-worker

確認MAC和product_uuid的唯一性

文檔鏈接: Verify the MAC address and product_uuid are unique for every node

[root@k8s-master ~]$ ifconfig -a    # 查看MAC  [root@k8s-master ~]$ cat /sys/class/dmi/id/product_uuid # 查看product_uuid

注: 如果你的centos7沒有ifconfig命令, 可以執行yum install net-tools進行安裝.

配置防火牆

文檔鏈接: Check required ports

由於是本地內網測試環境, 筆者圖方便, 直接關閉了防火牆. 若安全要求較高, 可以參考官方文檔放行必要埠.

[root@k8s-master ~]$ systemctl stop firewalld   # 關閉服務  [root@k8s-master ~]$ systemctl disable firewalld    # 禁用服務

禁用SELinux

文檔鏈接: coredns pods have CrashLoopBackOff or Error state

修改/etc/selinux/config, 設置SELINUX=disabled. 重啟機器.

[root@k8s-master ~]$ sestatus   # 查看SELinux狀態  SELinux status: disabled

禁用交換分區

文檔鏈接: Before you begin Swap disabled. You MUST disable swap in order for the kubelet to work properly.

編輯/etc/fstab, 將swap注釋掉. 重啟機器.

[root@k8s-master ~]$ vim /etc/fstab  #/dev/mapper/cl-swap     swap                    swap    defaults        0 0

安裝Docker

文檔鏈接: Get Docker Engine – Community for CentOS

Docker官方文檔對安裝步驟描述已經足夠詳細, 過程並不複雜, 本文便不再贅述.

  • Docker請使用18.09, k8s暫不支援Docker最新版19.x, 安裝時請按照文檔描述的方式明確指定版本號yum install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7 containerd.io.
  • 若網路不好, 可換用中國源, 阿里雲、中科大等都可. 此處附上阿里雲源docker安裝文檔地址: 容器鏡像服務.
  • 安裝完畢後, 建議將docker源替換為中國. 推薦阿里雲鏡像加速, 有阿里雲帳號即可免費使用.阿里雲 -> 容器鏡像服務 -> 鏡像中心 -> 鏡像加速

配置Docker

文檔地址: Container runtimes

修改/etc/docker/daemon.json為如下內容:

{    "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"],    "exec-opts": ["native.cgroupdriver=systemd"],    "log-driver": "json-file",    "log-opts": {      "max-size": "100m"    },    "storage-driver": "overlay2"  }
  • 其中https://xxxxxxxx.mirror.aliyuncs.com阿里雲鏡像加速地址, xxxxxxxx需要替換為自己賬戶中的地址. 如圖:

安裝配置完畢後執行:

[root@k8s-master ~]$ systemctl enable docker  [root@k8s-master ~]$ systemctl start docker

安裝Kubernetes

文檔地址: Installing kubeadm, kubelet and kubectl

添加源

由於中國網路原因, 官方文檔中的地址不可用, 本文替換為阿里雲鏡像地址, 執行以下程式碼即可:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo  [kubernetes]  name=Kubernetes  baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64  enabled=1  gpgcheck=1  repo_gpgcheck=1  gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg  exclude=kube*  EOF

安裝

[root@k8s-master ~]$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes  [root@k8s-master ~]$ systemctl enable kubelet && systemctl start kubelet

修改網路配置

cat <<EOF >  /etc/sysctl.d/k8s.conf  net.bridge.bridge-nf-call-ip6tables = 1  net.bridge.bridge-nf-call-iptables = 1  EOF  sysctl --system

注意: 至此, 以上的全部操作, 在Worker機器上也需要執行. 注意hostname等不要相同.

初始化Master

生成初始化文件

[root@k8s-master ~]$ kubeadm config print init-defaults > kubeadm-init.yaml

該文件有兩處需要修改:

  • advertiseAddress: 1.2.3.4修改為本機地址
  • imageRepository: k8s.gcr.io修改為imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

修改完畢後文件如下:

apiVersion: kubeadm.k8s.io/v1beta2  bootstrapTokens:  - groups:    - system:bootstrappers:kubeadm:default-node-token    token: abcdef.0123456789abcdef    ttl: 24h0m0s    usages:    - signing    - authentication  kind: InitConfiguration  localAPIEndpoint:    advertiseAddress: 10.33.30.92    bindPort: 6443  nodeRegistration:    criSocket: /var/run/dockershim.sock    name: k8s-master    taints:    - effect: NoSchedule      key: node-role.kubernetes.io/master  ---  apiServer:    timeoutForControlPlane: 4m0s  apiVersion: kubeadm.k8s.io/v1beta2  certificatesDir: /etc/kubernetes/pki  clusterName: kubernetes  controllerManager: {}  dns:    type: CoreDNS  etcd:    local:      dataDir: /var/lib/etcd  imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers  kind: ClusterConfiguration  kubernetesVersion: v1.15.0  networking:    dnsDomain: cluster.local    serviceSubnet: 10.96.0.0/12  scheduler: {}

下載鏡像

[root@k8s-master ~]$ kubeadm config images pull --config kubeadm-init.yaml

[版權聲明] 本文發佈於朴瑞卿的部落格, 允許非商業用途轉載, 但轉載必須保留原作者朴瑞卿 及鏈接:https://blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯繫郵箱: [email protected].

執行初始化

[root@k8s-master ~]$ kubeadm init --config kubeadm-init.yaml

等待執行完畢後, 會輸出如下內容:

...  Your Kubernetes control-plane has initialized successfully!  ...  Then you can join any number of worker nodes by running the following on each as root:    kubeadm join 10.33.30.92:6443 --token abcdef.0123456789abcdef       --discovery-token-ca-cert-hash sha256:2883b1961db36593fb67ab5cd024f451b934fc0e72e2fa3858dda3ad3b225837 

最後兩行需要保存下來, kubeadm join ...是worker節點加入所需要執行的命令.

接下來配置環境, 讓當前用戶可以執行kubectl命令:

mkdir -p $HOME/.kube  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  sudo chown $(id -u):$(id -g) $HOME/.kube/config

測試一下: 此處的NotReady是因為網路還沒配置.

[root@k8s-master kubernetes]$ kubectl get node  NAME         STATUS     ROLES    AGE     VERSION  k8s-master   NotReady   master   3m25s   v1.15.3

配置網路

文檔地址: Instructions

下載描述文件

[root@k8s-master ~]$ wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml  [root@k8s-master ~]$ cat kubeadm-init.yaml | grep serviceSubnet:  serviceSubnet: 10.96.0.0/12

打開calico.yaml, 將192.168.0.0/16修改為10.96.0.0/12

需要注意的是, calico.yaml中的IP和kubeadm-init.yaml需要保持一致, 要麼初始化前修改kubeadm-init.yaml, 要麼初始化後修改calico.yaml.

執行kubectl apply -f calico.yaml 初始化網路.

此時查看node資訊, master的狀態已經是Ready了.

[root@k8s-master ~]$ kubectl get node  NAME         STATUS   ROLES    AGE   VERSION  k8s-master   Ready    master   15m   v1.15.3

安裝Dashboard

文檔地址: Web UI (Dashboard)

部署Dashboard

文檔地址: Deploying the Dashboard UI

[root@k8s-master ~]$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml  [root@k8s-master ~]$ kubectl apply -f recommended.yaml 

部署完畢後, 執行kubectl get pods --all-namespaces查看pods狀態

[root@k8s-master kubernetes]$ kubectl get pods --all-namespaces | grep dashboard  NAMESPACE              NAME                                        READY   STATUS  kubernetes-dashboard   dashboard-metrics-scraper-fb986f88d-m9d8z   1/1     Running  kubernetes-dashboard   kubernetes-dashboard-6bb65fcc49-7s85s       1/1     Running 

創建用戶

文檔地址: Creating sample user

創建一個用於登錄Dashboard的用戶. 創建文件dashboard-adminuser.yaml內容如下:

apiVersion: v1  kind: ServiceAccount  metadata:    name: admin-user    namespace: kube-system  ---  apiVersion: rbac.authorization.k8s.io/v1  kind: ClusterRoleBinding  metadata:    name: admin-user  roleRef:    apiGroup: rbac.authorization.k8s.io    kind: ClusterRole    name: cluster-admin  subjects:  - kind: ServiceAccount    name: admin-user    namespace: kube-system

執行命令kubectl apply -f dashboard-adminuser.yaml .

生成證書

文檔地址: Accessing Dashboard 1.7.X and above

官方文檔中提供了登錄1.7.X以上版本的登錄方式, 但並不清晰, 筆者沒有完全按照該文檔的方式進行操作.

[root@k8s-master ~]$ grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt  [root@k8s-master ~]$ grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key  [root@k8s-master ~]$ openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

第三條命令生成證書時會提示輸入密碼, 可以直接兩次回車跳過.

kubecfg.p12即需要導入客戶端機器的證書. 將證書拷貝到客戶端機器上, 導入即可.

~$ scp [email protected]:/root/.kube/kubecfg.p12 ./
  • 需要注意的是: 若生成證書時跳過了密碼, 導入時提示填寫密碼直接回車即可, 不要糾結密碼哪來的 (゚▽゚)/

此時我們可以登錄面板了, 訪問地址: https://{k8s-master-ip}:6443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login, 登錄時會提示選擇證書, 確認後會提示輸入當前用戶名密碼(注意是電腦的用戶名密碼).

登錄Dashboard

文檔地址:Bearer Token

執行kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}'), 獲取Token.

[root@k8s-master .kube]$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')  Name:         admin-user-token-dhhkb  Namespace:    kube-system  Labels:       <none>  Annotations:  kubernetes.io/service-account.name: admin-user                kubernetes.io/service-account.uid: b20d1143-ce94-4379-9e14-8f80f06d8479    Type:  kubernetes.io/service-account-token    Data  ====  ca.crt:     1025 bytes  namespace:  11 bytes  token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWRoaGtiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiMjBkMTE0My1jZTk0LTQzNzktOWUxNC04ZjgwZjA2ZDg0NzkiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.f6IbPGwIdFZWStzBj8_vmF01oWW5ccaCpPuVQNLSK1pgEqn0kNVK_x0RYSuKEnujObzpQQdFiRYcI6ITHja2PIVc5Nv83VCn5IaLvZdYuGZWUYRw0efJUBMA4J4N8-pRkiw6fYAuWLeGYghLNXL_nDdC_JkG75ASqrr3U1MVaikOcfrEPaI-T_AJ3TMYhI8aFoKiERpumu5W1K6Jl80Am9pWDX0Ywis5SSUP1VYfu-coI48EXSptcaxEyv58PrHUd6t_oMVV9rpqSxrNtMZvMeXqe8Hnl21vR7ls5yTZegYtHXSc3PKvCaIalKhYXAuhogNcIXHaMzvLSbf-DSQkVw

複製該Token到登錄頁, 點擊登錄即可, 效果如下:

添加Worker節點

重複執行 前期準備-修改hostname ~ 安裝Kubernetes-修改網路配置的全部操作, 初始化一個Worker機器.

執行如下命令將Worker加入集群:

kubeadm join 10.33.30.92:6443 --token abcdef.0123456789abcdef       --discovery-token-ca-cert-hash sha256:2883b1961db36593fb67ab5cd024f451b934fc0e72e2fa3858dda3ad3b225837 
  • 注意: 此處的秘鑰是初始化Master後生成的, 參考前文.

添加完畢後, 在Master上查看節點狀態:

[root@k8s-master ~]$ kubectl get node  NAME         STATUS   ROLES    AGE   VERSION  k8s-master   Ready    master   10h   v1.15.3  k8s-worker   Ready    <none>   96s   v1.15.3

在面板上也可查看:

參考文獻

© 2019, 朴瑞卿.

[版權聲明] 本文發佈於朴瑞卿的部落格, 允許非商業用途轉載, 但轉載必須保留原作者朴瑞卿 及鏈接:https://blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯繫郵箱: [email protected].