kubernetes&&基础学习


  • k8s架构图
  • 常见插件
  • CoreDNS
  • Dashboard
  • INGRESS CONTROLLER
  • FEDERATION
  • Prometheus
  • EFK
  • Pod
  • 概念
  • Pod控制器类型
  • ReplicationController & ReplicaSet & Deployment
  • StatefullSet
  • DaemonSet
  • Job,Cronjob
  • 服务发现
  • 网络通讯方式
  • k8s如何实现网络通讯
  • Flannel如何运行
  • etcd的作用
  • 网络类型
  • k8s集群的部署
  • 部署koolshare
  • 部署Harbor
  • 部署master节点
  • 部署node节点
  • 部署私有镜像仓库harbor
  • k8s集群从私有镜像仓库下载镜像
  • 资源清单
  • k8s中的资源
  • 名称空间级别
  • 集群级资源
  • 元数据型资源
  • 资源清单
  • 含义
  • 常用字段解释说明
  • 容器生命周期
  • init容器
  • 容器探针


pod是k8s的最小单位
pod是一组容器的集合
pod控制器监控一组容器的运行状态(动态移除、添加容器)

service
通过暴露(以ip加端口的方式),实现客户端对pod服务的访问。

有状态服务
系统运行过程中必须实时存在的服务,如DB,随意的移走会造成数据遗失。
无状态服务
系统运行过程中允许暂时更替的服务,如Apache,可随意更替功能配置相同服务的Apache

调度器
控制任意的pod运行在任意的节点

集群安全机制
集群的认证、鉴权、访问控制、原理及其流程

helm
类似yum、apt等软件安装工具,实现一条命令部署一个集群。

k8s架构图

软路由自启进不了BIOS 软路由开机进bios_Pod


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是通过标签实现的。

软路由自启进不了BIOS 软路由开机进bios_docker_02


service帮助Pod映射出IP和端口,实现客户端对Pod服务的使用

service支持RR(轮询)算法。

软路由自启进不了BIOS 软路由开机进bios_软路由自启进不了BIOS_03

网络通讯方式

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),通过这个覆盖网络,将数据包原封不动的传递到目标容器内。

软路由自启进不了BIOS 软路由开机进bios_软路由自启进不了BIOS_04


Flanneld:守护进程,会持续的监听特定端口,目标端口用于接收、转发数据包。Flanneld启动时会创建一个网桥Flannel0 10.1.15.0/16,网桥Flannel0专门用于收集Docker0送出的数据并实现数据包的二次封装,Flanneld使用UDP类型的数据报文转发数据。Docker0会为对应的Pod分配ip地址,

软路由自启进不了BIOS 软路由开机进bios_docker_05

etcd的作用

ETCD之Flannel提供说明:

  • 存储管理Flannel可分配的IP地址段资源
  • 监控ETCD中每个Pod的实际地址,并在内存中建立维护Pod节点路由表
网络类型

软路由自启进不了BIOS 软路由开机进bios_Pod_06


service和pod网络均为虚拟网络;节点网络属于物理网络。

k8s集群的部署

软路由自启进不了BIOS 软路由开机进bios_IP_07


如上图所示,当前的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文件我们一般称为资源清单

常用字段解释说明

软路由自启进不了BIOS 软路由开机进bios_Pod_08


软路由自启进不了BIOS 软路由开机进bios_Pod_09


软路由自启进不了BIOS 软路由开机进bios_docker_10


软路由自启进不了BIOS 软路由开机进bios_软路由自启进不了BIOS_11


软路由自启进不了BIOS 软路由开机进bios_docker_12


软路由自启进不了BIOS 软路由开机进bios_docker_13


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

容器生命周期

软路由自启进不了BIOS 软路由开机进bios_Pod_14


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容器的作用:

软路由自启进不了BIOS 软路由开机进bios_Pod_15


Init C 模板

软路由自启进不了BIOS 软路由开机进bios_Pod_16


软路由自启进不了BIOS 软路由开机进bios_Pod_17


Init C特殊说明:

软路由自启进不了BIOS 软路由开机进bios_IP_18


Pod启动的第一个容器是pause容器,并非init C容器

“网络和数据卷初始化之后”指的是pause完成启动之后

更改Pod的运行状态:

# 查询当前Pod的运行状态
kubectl  get  pod
# 编辑目标Pod的运行状态
kubectl  edit  pod  myapp-pod

软路由自启进不了BIOS 软路由开机进bios_Pod_19

容器探针

软路由自启进不了BIOS 软路由开机进bios_Pod_20


探测方式:

软路由自启进不了BIOS 软路由开机进bios_IP_21


如何实现探针:

软路由自启进不了BIOS 软路由开机进bios_IP_22


软路由自启进不了BIOS 软路由开机进bios_软路由自启进不了BIOS_23


软路由自启进不了BIOS 软路由开机进bios_docker_24


软路由自启进不了BIOS 软路由开机进bios_docker_25


软路由自启进不了BIOS 软路由开机进bios_软路由自启进不了BIOS_26


软路由自启进不了BIOS 软路由开机进bios_Pod_27