運維篇 k8s(Kubernetes)

1. 什麼是k8s?

k8s是kubernetes的簡稱,即字母“k”到最後一位相隔8位字母。名字來源於希臘語,意思是“舵手”或“領航員”。

kubernetes是容器集羣管理系統,是一個開源的平臺,可以實現容器集羣的自動化部署、自動擴縮容、維護等功能;它是google在2014年發佈的一個開源項目,據說google的數據中心裏運行着10多一個容器,而且google十多年前就開始使用容器技術,最初,google開發了一個叫borg的系統(現在命名爲Omega)來調度如此龐大數量的容器好工作負載,在積累了這麼多年的經驗後,google決定重寫這個容器管理系統,並將其貢獻到開源社區,讓全世界受益。

特點:

  • 可移植:支持公有云,私有云,混合雲,多重雲(多個公共雲)
  • 可擴展:模塊化,插件化,可掛載,可組合
  • 自動化:自動部署,自動重啓,自動複製,自動伸縮/擴展

kubernetes解決了什麼?

  • 多個進程協同工作
  • 存儲系統掛載
  • 應用健康檢查
  • 應用實例的複製
  • 自動伸縮/擴展
  • 註冊與發現
  • 負載均衡
  • 滾動更新
  • 資源監控
  • 日誌訪問
  • 調試應用程序
  • 提供認證和授權

大量的Paas系統都可以運行在Kubernetes上,由於Kubernetes運行在應用界別而不是硬件級,因此提供了普通的Paas平臺提供的一些通用功能,比如部署、擴展、負載均衡、日誌、監控等。這些默認功能是可選的。

另外,kubernetes不僅僅是一個“編排系統”,它消除了編排的需要。“編排”的定義是指執行一個預定的工作流:先執行A,之後B,然後C 。相反,kubernetes由一組獨立的可組合控制進程組成。怎麼樣從A到C並不重要,達到目的就好,當然幾種控制也是必不可少,方法更像排舞的過程。這使得系統更加易用、強大、彈性和可擴展。

2. 安裝Ubuntu server

  1. 下載Ubuntu sever,這裏我下載的是20.04版本
  2. 步驟
  • English -》done -》 done
  • proxy address(設置代理,跳過) - 》 done
  • mirror address (軟件源,設置成阿里雲的) - 》
    • http:/mirrors.aliyun.com/ubuntu/ - 》 done
  • 一直done
  • 只能是在普通用戶
  • 選中安裝ssh
  • 一直done
  • reboot
  1. 設置root密碼
  • sudo passwd root
  • su
  1. 設置遠程登錄root賬戶
  • vim /etc/ssh/sshd_config
    增加一行
    PermitRootLogin yes
  1. 重啓服務
    service ssh restart

  2. 關閉交換空間(k8s需要關掉,不然佔用會很大)
    swapoff -a

  3. 關閉防火牆
    ufw disable

  4. 重啓登錄root賬戶使操作生效

3. 安裝docker

#更新軟件源
apt-get update

#安裝apt依賴,用於通過HTTPS獲取倉庫
apt-get -y install apt-transport-https ca-certificates curl software-properties-common

#添加docker官方gpg證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

#設置倉庫
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
#這裏如果設置出現404看下面

#更新軟件源
apt-get -y update

#安裝docker-ce
apt-get -y install docker-ce

#設置docker 開啓啓動和源
#這裏就和上一篇dockers安裝是一樣 的
#開機啓動
systemctl enable docker

#這種docker源
vim  /etc/docker/daemon.json 
#加入下面json

 { "registry-mirrors": ["https://5258x07n.mirror.aliyuncs.com"] }

這裏設置倉庫出現下面報錯:404

The repository ‘http://mirrors.aliyun.com/docker-ce/linux/ubuntu focal Release’ does not have a Release file.
The repository ‘https://download.docker.com/linux/ubuntu focal Release’ does not have a Release file.

在這裏插入圖片描述

我找到這篇博客:https://www.jb51.net/article/173316.htm
vim /etc/apt/sources.list
增加
deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable
註釋掉原先添加的
在這裏插入圖片描述

4. 搭建集羣

Master
Master 是 Cluster 的大腦,它的主要職責是調度,即決定將應用放在哪裏運行。

Node
Node 是 Pod 真正運行的主機,可以是物理機,也可以是虛擬機。爲了管理 Pod,每個 Node 節點上至少要運行 container runtime(比如 docker 或者 rkt)、 kubelet 和 kube-proxy 服務。

Pod
Kubernetes 使用 Pod 來管理容器,每個 Pod 可以包含一個或多個緊密關聯的容器。
Pod 是一組緊密關聯的容器集合,它們共享 PID、IPC、Network 和 UTS namespace,是 Kubernetes 調度的基本 單位。Pod 內的多個容器共享網絡和文件系統,可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。

Service
Service 是應用服務的抽象,通過 labels 爲應用提供負載均衡和服務發現。匹配 labels 的 Pod IP 和端口列表組成 endpoints,由 kube-proxy 負責將服務 IP 負載均衡到這些 endpoints 上。

每個 Service 都會自動分配一個 cluster IP(僅在集羣內部可訪問的虛擬地址)和 DNS 名,其他容器可以通過該地址 或 DNS 來訪問服務,而不需要了解後端容器的運行

kubernetes組件

  • etcd 保存了整個集羣的狀態,服務註冊發現;
  • kube-apiserver 提供了資源操作的唯一入口,並提供認證、授權、訪問控制等機制;
  • kube-controller-manager 負責維護集羣的狀態,比如故障檢測、自動擴展、滾動更新等;
  • kube-scheduler 負責資源的調度,按照預定的調度策略將 Pod 調度到相應的機器上;
  • kubelet 負責維持容器的生命週期,同時也負責 Volume(CVI)和網絡(CNI)的管理;
  • Container runtime 負責鏡像管理以及 Pod 和容器的真正運行(CRI),默認的容器運行時爲 Docker;
  • kube-proxy 負責爲 Service 提供 cluster 內部的服務發現和負載均衡;

1. 修改主機名

查看Ubuntu環境配置文件cloud.cfg(/etc/cloud目錄下);管理需要制定主機名

vim /etc/cloud/cloud.cfg
preserve_hostname: true

修改主機名爲kubernetes-master

hostnamectl set-hostname kubernetes-master
#查看是否修改成功
hostnamectl

2. 安裝kubelet、kubeadm、kubectl

  • kubelet:主要負責啓動pod和容器
  • kubeadm:用於初始化kubernetes集羣
  • kubectl:kubernetes的命令行工具,作用是部署和管理應用,查看各種資源,創建,刪除和更新組件

#安裝系統工具
apt-get update && apt-get install -y apt-transport-http

安裝gpg證書
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
#安裝kubelet、kubeadm、kubectl
apt-get update
#這裏安裝換後注意看一下它安裝的版本號,後面用到,就如下圖
apt-get install -y kubelet kubeadm kubectl
#設置開機啓動
systemctl enable kubelet && systemctl start kubelet

版本號圖
在這裏插入圖片描述

3. 配置master

首先找一個目錄放置配置文件,進入這個目錄進行下面操作

  1. 導出配置文件

kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

  1. 修改
#修改advertiseAddress:爲master主機IP 
 advertiseAddress: 192.168.202.128 
 #因爲有牆,把鏡像源修改爲國內的,比如阿里雲 
imageRepository: registry.aliyuncs.com/google_containers 
#順便配置calico的默認網段(後面網絡配置會用到) 
podSubnet: "192.168.0.0/16"
#修改kubernetes的版本
kubernetesVersion: v1.18.2

在這裏插入圖片描述

  1. 拉取鏡像
    如果上面沒設置版本,拉取下來的可能和我們的版本不對應,修改版本號,
    然後倉庫了東西可以用這樣的命令刪除:docker rmi -f registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.0
#查看所需鏡像列表 
kubeadm config images list --config kubeadm.yml
#拉取鏡像 
kubeadm config images pull --config kubeadm.yml
  1. 初始化主節點
#定了初始化時需要使用的配置文件,其中添加 --experimental-upload-certs 參數可以在後續執行加入節點時自動 分發證書文件。追加的 tee kubeadm-init.log 用以輸出日誌 (這個日誌也算重要的)
kubeadm init --config=kubeadm.yml --experimental-upload-certs | tee kubeadm-init.log

但是出現報錯:unknown flag: --experimental-upload-certs
百度知道這是版本升級造成的,將將–experimental-upload-certs 替換爲 --upload-certs
所以應該使用下面的命令

kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

執行這個命令會檢查我們的機子是否複合要求
這裏我執行後就提示我CPU需要2核,轉好虛擬機後就沒設置這些東西
在這裏插入圖片描述

之後設置後,看到successful小激動一下,記下下圖中最下面的那行用來加入節點的,如果你清空面板,找不到了,就找剛剛保存的那個日誌文件: kubeadm-init.log
在這裏插入圖片描述

  1. 成功後
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

kubeadm init 的執行過程
init:指定版本進行初始化操作
preflight:初始化前的檢查和下載所需要的 Docker 鏡像文件
kubelet-start:生成 kubelet 的配置文件 var/lib/kubelet/config.yaml ,沒有這個文件 kubelet 無法啓
動,所以初始化之前的 kubelet 實際上啓動不會成功
certificates:生成 Kubernetes 使用的證書,存放在 /etc/kubernetes/pki 目錄中
kubeconfig:生成 KubeConfig 文件,存放在 /etc/kubernetes 目錄中,組件之間通信需要使用對應文件
control-plane:使用 /etc/kubernetes/manifest 目錄下的 YAML 文件,安裝 Master 組件
etcd:使用 /etc/kubernetes/manifest/etcd.yaml 安裝 Etcd 服務
wait-control-plane:等待 control-plan 部署的 Master 組件啓動
apiclient:檢查 Master 組件服務狀態。
uploadconfig:更新配置
kubelet:使用 configMap 配置 kubelet
patchnode:更新 CNI 信息到 Node 上,通過註釋的方式記錄
mark-control-plane:爲當前節點打標籤,打了角色 Master,和不可調度標籤,這樣默認就不會使用 Master
節點來運行 Pod
bootstrap-token:生成 token 記錄下來,後邊使用 kubeadm join 往集羣中添加節點時會用到
addons:安裝附加組件 CoreDNS 和 kube-proxy

4. 配置node

  1. 安裝上面的步驟配置,直到“配置Master”

  2. 然後在節點機:

kubeadm join 192.168.17.129:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:6a051b8d0b670f357fe0d8e6a282b062b6f090d1b90968d6c3f3cea8dd33d104 

  1. 然後在master主機驗證是否節點是否加入
    kubectl get nodes

5. 網絡配置

加入節點後,但我們的容器還沒真正相同,需要配置網絡,
查看kubernetes組件狀態

kubectl get pod -n kube-system -o wide

查看網關
route -n
如果沒有route 命令,那就安裝一下:apt install net-tools
在這裏插入圖片描述

#修改配置文件
vim /etc/netplan/00-installer-config.yaml

network:
  ethernets:
    ens33:
      #dhcp4: true
      addresses: [192.168.17.129/24]
      gateway4: 192.168.17.2
      nameservers:
              addresses: [192.168.17.2]
  version: 2

#刷新配置
netplan apply

修改DNS


#ubuntu18的dns配置文件是交給systemd-resolved這個服務管理的,有可能會被他覆蓋我們自定的dns地址,所以先停止 systemd-resolved的服務 
systemctl stop systemd-resolved

#修改dns 
vim /etc/systemd/resolved.conf 
nameserver 8.8.8.8

systemctl start systemd-resolved

#測試
ping www.baidu.com
  1. 安裝Calico
    設置好網絡後,kubernetes還需要安裝calico提供網絡鏈接方案。
    官方文檔安裝:
    https://docs.projectcalico.org/getting-started/kubernetes/quickstart
#在Master操作即可 
kubectl apply -f https://docs.projectcalico.org/v3.7/manifests/calico.yaml 
#驗證是否成功 
kubectl get pods --all-namespaces

如果在安裝時有一個pod沒有啓動起來,就把節點刪除,重新加入

出現過:ImagePullBackOff,ErrImagePull
刪除節點,重新加入,重入,可以將節點機重啓一下。

刪除節點
kubectl delete node kubernetes-node1

在刪除的節點機上
kubeadm reset

然後再執行kubectl join …

6. 實例:運行tomcat容器

  1. 健康檢查

kubectl get cs

#scheduler調度服務,主要作用是將 POD 調度到 Node
#controller-manage自動化修復服務,主要作用是 Node 宕機後自動修復 Node 回到正常的工作狀態
#etcd-0服務註冊與發現
在這裏插入圖片描述

  1. 查看master狀態
    kubectl cluster-info

  2. 查看node狀態
    kubectl get nodes

  3. 運行tomcat容器
    #使用kubectl命令創建兩個監聽8080端口的tomcat pod(Kubernetes運行容器的最小單元)
    kubectl run tomcat --image=tomcat --replicas=2 --port=80

#查看pod狀態
kubectl get pods

#查看已部署的服務 (不知是不是版本問題,別人的版本這個命令可以看到tomcat的)
#看下面截圖中,發現創建的是pod/tomcat ,別人創建的是service/tomcat,不懂
kubectl get deployment
在這裏插入圖片描述

#映射服務
kubectl expose deployment tomcat --port=8080 --type=LoadBalancer
#沒有deployment,這裏改成
kubectl expose pod tomcat --port=8080 --type=LoadBalancer

#查看已經發布的服務 在這裏插入圖片描述

kubectl get services

#查看服務詳情
kubectl describe service tomcat

  1. 訪問
    端口31205
    在這裏插入圖片描述

在這裏插入圖片描述

  1. 刪除

kubectl delete pod tomcat
kubectl delete service tomcat

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章