kubernetes&&基礎學習1

pod是k8s的最小單位
pod是一組容器的集合
pod控制器監控一組容器的運行狀態(動態移除、添加容器)

service
通過暴露(以ip加端口的方式),實現客戶端對pod服務的訪問。

有狀態服務
系統運行過程中必須實時存在的服務,如DB,隨意的移走會造成數據遺失。
無狀態服務
系統運行過程中允許暫時更替的服務,如Apache,可隨意更替功能配置相同服務的Apache

調度器
控制任意的pod運行在任意的節點

集羣安全機制
集羣的認證、鑑權、訪問控制、原理及其流程

helm
類似yum、apt等軟件安裝工具,實現一條命令部署一個集羣。

k8s架構圖

在這裏插入圖片描述
scheduler將處理數據交給api server,api server將數據保存在etcd下。
高可用集羣副本的數量建議是大於3的奇數

  • api server
    一切服務的訪問入口,核心
  • scheduler
    接收任務,並分配任務到合適的節點(按節點資源分配)
  • replication controller
    維持副本數量達到期望值。
  • etcd
    保存數據,以鍵值對方式存儲。可信賴的分佈式鍵值存儲服務。
    保存能夠維持分佈局集羣持久穩定運行的配置文件信息。集羣異常時可通過etcd存儲的數據恢復。
    v3 : 將數據保存在本地持久化捲上(建議)
    v2 : 將數據保存在本地內存中(k8s1.11已棄用),若遇到,需定期手動數據備份
    在這裏插入圖片描述
  • kubelet
    控制docker服務,創建容器,維持pod的生命週期。CRI(container runtime interface)。直接與容器引擎進行交互。
  • kube proxy
    實現客戶端對服務資源的訪問、實現pod集羣的負載均衡。藉助Firewalls防火牆實現。通過添加規則到iptables或ip_vs,實現服務的映射訪問或負載均衡。

常見插件

CoreDNS

可以爲集羣中的SVC創建一個A記錄(域名-ip的對應關係解析),實現通過域名對pod的訪問。

Dashboard

爲k8s集羣提供一個B/S結構的訪問體系

INGRESS CONTROLLER

實現七層代理,即實現基於域名的負載均衡

FEDERATION

提供一個可以跨集羣中心的多k8s的統一管理功能

Prometheus

提供一個k8s集羣的監控能力

EFK

提供一個k8s集羣日誌統一分析接入平臺

Pod

概念

Pod管理一組容器(如一個LAMP環境,Apache容器+MySQL容器+PHP容器)
Pod啓動時,首先產生(啓動)一個默認的容器(名稱爲pause)。
同一個Pod內的一組容器共用pause的網絡棧及存儲卷。因此,同一個Pod內的一組容器間可通過localhost:port端口的方式互通訪問資源,就好像在同一個容器內一樣。
因此,同一個Pod內的一組容器之間端口不能相同(會衝突)。
同一個Pod內的一組容器,即共享網絡又共享存儲卷。

  • 自主式Pod
    非控制器管理的Pod,Pod一旦死亡不會被拯救、重置,而是放任不管。

  • 控制器管理的Pod

Pod控制器類型

ReplicationController & ReplicaSet & Deployment

  • ReplicationController
    用來確保容器應用的副本數始終保持在用戶定義的副本數,即如果有容器異常退出,則會自動創建新的Pod代替,且因爲異常多出來的容器也會自動回收。
    新版本的kubernetes中建議使用ReplicaSet來取代ReplicationController
  • ReplicaSet
    ReplicaSet與ReplicationController沒有本質的不同,只是名字不一樣,且ReplicaSet支持集合式的selector
    雖然ReplicaSet可以獨立使用,但一般還是建議使用Deployment來自動管理ReplicaSet,這樣就無需擔心跟其他機制的不兼容問題(比如ReplicaSet不支持rolling-update,但Deployment支持)
  • Deployment
    Deployment通過操控ReplicaSet實現容器的添加、刪除等操作。
    Deployment通過創建ReplicaSet達到創建Pod的目的。
    在這裏插入圖片描述
    HPA(HorizontalPodAutoScale)
    Horizontal Pod Autoscaling 僅適用於Deployment和ReplicaSet,在V1版本中僅支持根據Pod的CPU利用率擴、縮容;在vlalpha版本中,支持根據內存和用戶所定義的metric擴、縮容

StatefullSet

StatefulSet是爲了解決有狀態服務的問題(對應Deployments和ReplicaSets是爲了無狀態服務而設計),其應用場景包括:

  • 穩定的持久化存儲,即Pod重新調度後還是能訪問到相同的持久化數據,基於PVC實現
  • 穩定的網絡標誌,即Pod重新調度後其PodName和HostName不變,基於Headless Service(即沒有Cluster IP的service)來實現
  • 有序部署、有序擴展,即Pod是有順序的,在部署或者擴展的時候要根據定義的順序依次進行(即從0到N-1,在下一個Pod運行之前,所有之前的Pod都必須已經是Running和Ready狀態),基於init containers來實現。
  • 有序收縮,有序刪除(即從N-1到0)

DaemonSet

DaemonSet確保全部(或者一些)Node上運行一個(有且只有一個)Pod的副本。當有Node加入集羣時,也會爲他們新增一個Pod。當有Node從集羣移除時,這些Pod也會被回收。刪除DaemonSet將會刪除它創建的所有Pod
使用DaemonSet的一些典型用法:

  • 運行集羣存儲daemon,例如在每個Node上運行glusterd、ceph
  • 在每個Node上運行日誌收集daemon,例如fluentd、logstash
  • 在每個Node上運行監控daemon,例如Prometheus Node Exporter

Job,Cronjob

Job負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束
通過監控任務是否正常執行結束和退出,確保任務一定成功的執行結束

CronJob 管理基於時間的Job,即:

  • 在給定的時間點運行且僅運行一次
  • 週期性在給定的時間點運行

服務發現

如何確保一些Pod屬於同一組的Pod?同一組的Pod具有相干性,如同屬於同一個Deployment所創建、或擁有同一組的標籤等,同一組Pod具備相干性後,就容易被service所收集並劃分成同一組。
service收集Pod是通過標籤實現的。
在這裏插入圖片描述
service幫助Pod映射出IP和端口,實現客戶端對Pod服務的使用
service支持RR(輪詢)算法。
在這裏插入圖片描述

網絡通訊方式

Kubernetes的網絡模型假定了所有Pod都在一個可以直接連通的扁平(對於所有的Pod,均可以通過對方的ip直接到達)的網絡空間中,這在GCE(Google Compute Engine)裏面是現成的網絡模型,Kubernetes假定這個網絡已經存在。而在私有云裏搭建Kubernetes集羣,就不能假定這個網絡已經存在了。我們需要自己實現這個網絡假設,將不同節點上的docker容器之間的互相訪問先打通,然後運行kubernetes。

k8s如何實現網絡通訊

同一個Pod內的多個容器之間通訊:通過共用pause容器內的網絡棧實現,通過網絡棧的IO實現。同一個Pod共享同一個網絡命名空間,共享同一個Linux協議棧。

各Pod之間的通訊:通過overlay Network 實現。以Pod1和Pod2爲例,若Pod1與Pod2不在同一臺主機,Pod的地址是與docker0在同一個網段的,但docker0網段與宿主機網卡是兩個完全不同的IP網段並且不同Node之前的通信只能通過宿主機的物理網卡進行。將pod的IP與所在Node的IP關聯起來,通過這個關聯讓Pod可以互相訪問。若Pod1與Pod2在同一臺機器,則由docker0網橋直接轉發請求至Pod2,因此不需要經過Flannel。

Pod和Service之間的通訊:通過各節點的IPtables規則實現,目前以LVS的轉發和維護爲主。

Pod到外網:Pod向外網發送請求,查找路由表,轉發數據包到宿主機的網卡,宿主機網卡完成路由選擇後,iptables執行Masquerade,把源IP更改爲宿主網卡的IP,然後向外網服務器發送請求。(SNAT)

外網訪問Pod:通過service實現

Flannel如何運行

Flannel是CoreOS團隊針對Kubernetes設計的一個網絡規劃服務,簡單來說,他的功能是讓集羣中的不同節點主機創建的Docker容器都具有全集羣唯一的虛擬IP地址。而且它還能在這些IP地址之間建立一個覆蓋網絡(overlay Network),通過這個覆蓋網絡,將數據包原封不動的傳遞到目標容器內。
在這裏插入圖片描述
Flanneld:守護進程,會持續的監聽特定端口,目標端口用於接收、轉發數據包。Flanneld啓動時會創建一個網橋Flannel0 10.1.15.0/16,網橋Flannel0專門用於收集Docker0送出的數據並實現數據包的二次封裝,Flanneld使用UDP類型的數據報文轉發數據。Docker0會爲對應的Pod分配ip地址,
在這裏插入圖片描述

etcd的作用

ETCD之Flannel提供說明:

  • 存儲管理Flannel可分配的IP地址段資源
  • 監控ETCD中每個Pod的實際地址,並在內存中建立維護Pod節點路由表

網絡類型

在這裏插入圖片描述
service和pod網絡均爲虛擬網絡;節點網絡屬於物理網絡。

k8s集羣的部署

在這裏插入圖片描述
如上圖所示,當前的k8s集羣由一個master主服務和和兩個node工作節點組成。
Harbor爲私有鏡像倉庫
Router爲軟路由(部署koolshare服務)
建議操作系統版本不低於CentOS7或內核版本在3.1以上

部署koolshare

部署Harbor

部署master節點

配合IP地址:192.168.66.10

#網卡的最新規範,其會從BIOS的pcre通道內獲取網卡的最新信息.若沒有,可再找eth0配置文件
vi  /etc/sysconfig/network-scripts/ifcfg-ens33
#設置IP地址爲靜態IP地址,如192.168.66.10、20、21

設置系統主機名及host文件

hostnamectl  set-hostname  k8s-master01
#配置hosts文件,暫時寫死IP-域名
vim  /etc/hosts
    192.168.66.10  k8s-master01
    192.168.66.20  k8s-node01
    192.168.66.21  k8s-node02
    
#將hosts文件通過scp命令發送到另外兩個node節點
scp  /etc/hosts  root@k8s-node01:/etc/hosts
scp  /etc/hosts  root@k8s-node02:/etc/hosts

安裝軟件包

yum  install  -y  conntrack  ntpdate  ntp  ipvsadm  ipset  jq  iptables  curl  sysstat  libseccomp  wget  vim  net-tools  git

設置防火牆爲iptables並設置空規則

#關閉firewalld&&關閉自啓動&&安裝iptables-service管理工具&&啓動iptables&&設置iptables爲開機自啓&&清空iptables防火牆規則&&保存iptables防火牆規則
systemctl  stop  firewalld  &&  systemctl  disable  firewalld
yum  -y  install  iptables-services  &&  systemctl  start  iptables  &&  systemctl  enable  iptables  &&  iptables  -F  &&  service  iptables  save

關閉SELINUX

#關閉虛擬內存&&永久關閉虛擬內存。避免出現容器運行在虛擬內存的意外情況。
swapoff  -a  &&  sed  -i  '/ swap / s/^\(.*\)$/#\1/g'  /etc/fstab
#
setenforce  0  &&  sed  -i  's/^SELINUX=.*/SELINUX=disabled/'  /etc/selinux/config

調整內核參數,對於K8S

cat  >  kubernetes.conf  <<  EOF
#開啓網橋模式
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0  # 禁止使用swap空間,只有當系統OOMM時才允許使用它
vm.overcommit_memory=1  # 不檢查物理內存是否夠用
vm.panic_on_oom=0  # 開啓 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
#關閉ipv6協議
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
#複製文件到/etc/sysctl.d/目錄下,實現文件開機被調用
cp  kubernetes.conf  /etc/sysctl.d/kubernetes.conf
#令配置文件生效
sysctl -p  /etc/sysctl.d/kubernetes.conf

調整系統時區

#設置系統時區爲 中國/上海
timedatectl  set-timezone  Asia/Shanghai
#將當前的UTC時間寫入硬件時鐘
timedatectl  set-local-rtc  0
#重啓依賴於系統時間的服務
systemctl  restart  rsyslog
systemctl  restart crond

關閉系統不需要服務

systemctl  stop  postfix  &&  systemctl  disable  postfix

設置rsyslogd和systemd journald

mkdir  /var/log/journal # 持久化保存日誌的目錄
mkdir  /etc/systemd/journald.conf.d
cat  >  /etc/systemd/journald.conf.d/99-prophet.conf  <<  EOF
[Journal]
# 持久化保存到磁盤
Storage=presistent
# 壓縮歷史日誌
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大佔用空間 10G
SystemMaxUse=10G
# 單日誌文件最大 200M
SystemMaxFileSize=200M
# 日誌保存時間 2周
MaxRetentionSec=2week
# 不將日誌轉發到 syslog
ForwardToSyslog=no
EOF
systemctl  restart systemd-journald

升級系統內核爲4.44
CentOS 7.x系統自帶的3.10.x內核存在一些bug,導致運行的Docker、Kubernetes不穩定,例如: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

#採用elrepo源的安裝方式,安裝4.44版本內核
rpm  -Uvh  http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#安裝完成後檢查/boot/grub2/grub.cfg中對應內核menuentry中是否包含initrd16配置,如果沒有,再安裝一次!
yum  --enablerepo=elrepo-kernel  install  -y  kernel-lt
#設置開機從新內核啓動
grub2-set-default  "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"
#重啓服務器
reboot
#檢測內核版本是否爲4.44
uname  -r

kube-proxy開啓ipvs的前置條件

modprobe  br_netfilter

cat  >  /etc/sysconfig/modules/ipvs.modules  <<  EOF
#!/bin/bash
modprobe  --  ip_vs
modprobe  --  ip_vs_rr
modprobe  --  ip_vs_wrr
modprobe  --  ip_vs_sh
modprobe  --  nf_conntrack_ipv4
EOF
chmod  755  /etc/sysconfig/modules/ipvs.modules  &&  bash
/etc/sysconfig/modules/ipvs.modules  &&  lsmod  |  grep  -e  ip_vs  -e  nf_conntrack_ipv4  

安裝docker軟件

# 安裝依賴
yum  install  -y  yum-utils  device-mapper-persistent-data  lvm2
# 導入阿里雲的docker-ce的鏡像倉庫
yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum  update  -y  &&  yum  install  -y  docker-ce

# 此時系統內核版本應該已經不是4.44了,重新設置系統內核版本並重啓服務器
grub2-set-default  "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"  &&  reboot

#啓動docker並設置爲開機自啓動
systemctl  start  docker  &&  systemctl  enable  docker

# 創建 /etc/docker 目錄
mkdir  /etc/docker
# 配置daemon
cat  >  /etc/docker/daemon.json  <<  EOF
{
    "exec-opts" : ["native.cgroupdriver=systemd"],
    "log-driver" : "json-file",
    "log-opts" : {
        "max-size" : "100m"
    }
}
EOF
# 創建目錄存放docker生成的配置文件
mkdir  -p  /etc/systemd/system/docker.service.d
# 重啓docker服務
systemctl  daemon-reload  &&  systemctl  restart  docker  &&  systemctl  enable  docker

安裝kubeadm(主從配置)

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=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum  -y  install  kubeadm-1.15.1  kubectl-1.15.1  kubelet-1.15.1
systemctl  enable  kubelet.service

# rz上傳準備好的鏡像文件
# 解壓鏡像文件
tar  -zxvf  kubeadm-basic.images.tar.gz
# 編寫腳本讀取鏡像生成容器
vim  load-images.sh
    #!/bin/bash
    ls  /root/kubeadm-basic.images  >  /tmp/image-list.txt
    cd  /root/kubeadm-basic.images
    for i in $( cat /tmp/image-list.txt )
    do
        docker  load  -i  $i
    done
    rm  -rf  /tmp/image-list.txt
chmod  a+x  load-images.sh
./load-images.sh
#複製鏡像和腳本到兩個節點並加載鏡像爲容器
scp  -r  kubeadm-basic.images load-images.sh  root@k8s-node01:/root/
scp  -r  kubeadm-basic.images load-images.sh  root@k8s-node02:/root/

初始化主節點

#顯示默認的init文件並打印至kubeadm-config.yaml文件中
kubeadm config print init-defaults > kubeadm-config.yaml

vim  kubeadm-config.yaml
    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: 192.168.66.10
        bindPort: 6443
    --snip--
    kubernetesVersion: v1.15.1
    networking:
        podSubnet: "10.244.0.0/16"
        serviceSubnet: 10.96.0.0/12
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    featureGates:
        SupportIPVSProxyMode: true  
    mode: ipvs  #設置默認調度方式爲ip_vs方式
#初始化安裝,指定配置文件,頒發證書 | 
kubeadm init --config=kubeadm-config.yaml  --experimental-upload-certs | tee kubeadm-init.log
# 檢查日誌
cat  kubeadm-init.log

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  node 

加入主節點以及其餘工作節點

#執行安裝日誌中的加入命令即可

部署網絡

kubectl  apply  -f
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl  create  -f  kube-flannel.yml
kubectl  get  pod  -n  kube-system
# 此時kube-flannel組件已經成功運行了
kubectl  get  node
# 此時node節點已經處於ready狀態了

在node分節點執行以下命令(在kubeadm-init.log日誌文件中查看)加入node主節點

kubeadm  join  192.168.66.10:6443  --token  abcedf.0123456789abcdef  --discovery-token-ca-cert-hash  sha256:51e4c51e4c51e4c51e4c51e4clll

部署node節點

配合IP地址:192.168.66.20

#網卡的最新規範,其會從BIOS的pcre通道內獲取網卡的最新信息.若沒有,可再找eth0配置文件
vi  /etc/sysconfig/network-scripts/ifcfg-ens33
#設置IP地址爲靜態IP地址,如192.168.66.10、20、21

設置系統主機名及host文件

hostnamectl  set-hostname  k8s-node01

安裝軟件包

yum  install  -y  conntrack  ntpdate  ntp  ipvsadm  ipset  jq  iptables  curl  sysstat  libseccomp  wget  vim  net-tools  git

設置防火牆爲iptables並設置空規則

systemctl  stop  firewalld  &&  systemctl  disable  firewalld
yum  -y  install  iptables-services  &&  systemctl  start  iptables  &&  systemctl  enable  iptables  &&  iptables  -F  &&  service  iptables  save

關閉SELINUX

swapoff  -a  &&  sed  -i  '/ swap / s/^\(.*\)$/#\1/g'  /etc/fstab
setenforce  0  &&  sed  -i  's/^SELINUX=.*/SELINUX=disabled/'  /etc/selinux/config

部署私有鏡像倉庫harbor

配置docker配置文件

vim  /etc/docker/daemon.json
    {
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": {
            "max-size": "100m"
        },
        "insecure-registries": ["https://hub.atguigu.com"]
    }
# 重啓docker生效
systemctl  restart  docker

由於此處使用的是自制證書,因此需要在每個物理機的daemon.json文件中配置““insecure-registries”: [“https://hub.atguigu.com”]”,聲明私有docker鏡像倉庫是安全的

# 上傳docker-compose
mv  docker-compose  /usr/local/bin/
chmod  a+x  /usr/local/bin/docker-compose

tar  -zxvf  harbor-offline-installer-v1.2.0.tgz
cd  /usr/local/harbor
vim  harbor.cfg
# 創建存儲證書目錄
mkdir  -p  /data/cert
  
# 創建https證書以及配置相關目錄權限
openssl  genrsa  -des3  -out  server.key  2048
openssl  req -new  -key  server.key  --out  server.csr
cp  server.key  server.key.org
openssl  rsa  --in  server.key.org  --out  server.key
openssl  x509  -req  -days  365  -in  server.csr  -signkey  server.key  -out  server.crt
mkdir  /data/cert
chmod  -R  777  /data/cert
# 運行腳本進行安裝
cd  /usr/local/harbor/
./install.sh

# 在每臺物理機上固化域名解析
echo  "192.168.66.100  hub.atguigu.com"  >>  /etc/hosts

客戶端使用瀏覽器打開hub.atguigu.com訪問測試,查看鏡像倉庫

docker 訪問私有鏡像倉庫

docker  login  https://hub.atguigu.com
# 下載鏡像
docker  pull  wangyanglinux/myapp:v1
# 自定義鏡像標籤
docker  tag  wangyanglinux/myapp:v1  hub.atguigu.com/library/myapp:v1
# 推送鏡像到私有鏡像倉庫
docker  push  hub.atguigu.com/library/myapp:v1

k8s集羣從私有鏡像倉庫下載鏡像

# 啓動一個pod,
kubectl  run  nginx-deployment  --image=hub.atguigu.com/library/myapp:v1  --port=80  --replicas=1
kubectl  get  deployment
kubectl  get  rs
kubectl  get  pod  -o  wide

# 訪問容器測試
curl  10.244.2.2
# 增加期望運行副本數
kubectl  scale  --replicas=3  deployment/nginx-deployment

kubectl  expose  deployment  nginx-deployment  --port=30000  --target-port=80
kubectl  get  svc
# 暴露 pod 的訪問端口
kubectl  edit  svc  nginx-deployment
    type: NodePort
kubectl  get  svc
# 此時客戶端可以通過暴露的端口訪問node內服務

–replicas=1 : 副本數爲1

資源清單

k8s中的資源

名稱空間級別

僅在此名稱空間下失效。
工作負載型資源(workload):
Pod,ReplicaSet,Deployment.StatefulSet,DaemonSet,Job,CronJob(ReplicationController 在v1.11版本被廢棄)
服務發現及負載均衡資源(ServiceDiscovery LoadBalance):
Service,Ingress,
配置與存儲型資源:
Volume(存儲卷),CSI(容器存儲接口,可以擴展各種各樣的第三方存儲卷)
特殊類型的存儲卷:
configMap(當配置中心來使用的資源類型),Secret(保存敏感數據),DownwardAPI(把外部環境中的信息輸出給容器)

集羣級資源

NameSpace,Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding

元數據型資源

HPA,PodTemplate,LimitRange
根據一些指標去進行一定的操作

資源清單

含義

在k8s中,一般使用yaml格式的文件來創建符合我們預期期望的pod,這樣的yaml文件我們一般稱爲資源清單

常用字段解釋說明

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
pod模板

vim  pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
        name: myapp-pod
        namespace: default
        labels: 
            app: myapp
            version: v1
    spec:
        containers:
        - name: app
          image: hub.atguigu.com/library/myapp:v1
# 創建pod
kubectl  create  -f  pod.yaml
# 查看pod
kubectl  get  pod

容器生命週期

在這裏插入圖片描述
init C : 初始化容器,可以是零個或多個
init C 無法同時運行,只能運行完成結束一個再開始運行下一個。
init C 在pod生命週期的初始階段運行並結束。
pause(pod的基礎容器)在init C執行之前創建完成
main C : 主容器
readiness : 就緒檢測,確認主容器是否已經部署完成並運行
liveness : 生存檢測,確認主容器是否正常運行並提供服務(而未陷入假死狀態)
kubectl調用》api,api通過etcd調用》kubelet》調用CRI,創建型新容器》創建pause基礎容器》初始化容器(init C)

init容器

Pod能夠具有多個容器,應用運行在容器裏面,但是他也可能有一個或多個先於應用容器啓動的Init容器
Init 容器與普通的容器非常像,除了如下兩點:

  • Init 容器總是運行到成功完成爲止
  • 每個Init容器都必須在下一個Init容器啓動之前成功完成

如果Pod的Init容器失敗,kubernetes會不斷的重啓該Pod,直到Init容器成功爲止
如果Pod對應的restartPolicy爲Never,它不會重新啓動

Init容器的作用:
在這裏插入圖片描述
Init C 模板
在這裏插入圖片描述
在這裏插入圖片描述
Init C特殊說明:
在這裏插入圖片描述
Pod啓動的第一個容器是pause容器,並非init C容器
“網絡和數據卷初始化之後”指的是pause完成啓動之後

更改Pod的運行狀態:

# 查詢當前Pod的運行狀態
kubectl  get  pod
# 編輯目標Pod的運行狀態
kubectl  edit  pod  myapp-pod

在這裏插入圖片描述

容器探針

在這裏插入圖片描述
探測方式:
在這裏插入圖片描述
如何實現探針:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

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