Kuberbetes(K8S)_基础知识

Kubernetes(K8S)

前置知识

  1. Linux操作系统
  2. Docker

第一部分

  • k8s概念和架构

第二部分

  • 从零搭建k8s集群
    • 基于客户端的工具kubeadm(k5m)
    • 基于二级制包方式

第三部分 k8s核心概念

  • Pod
  • Controller
  • Service Ingress
  • RABC
  • Helm工具等

第四部分 搭建集群监控系统

第五部分 从零搭建高可用k8s集群

第六部分 在集群环境部署项目

第一部分

1、K8S基本概述和特性

2、K8S架构的组件

3、K8S核心概念

  • Pod
  • Controller
  • Service

1、K8S概述

  • K8S是谷歌2014年容器化集群管理系统
  • 使用K8S进行容器化应用部署
  • 使用K8S利于应用扩展
  • K8S目标实施让容器化应用更加简洁和高效

2、K8S的特性

  1. 自动装箱
  2. 自我修复(自愈能力)
  3. 水平扩展
  4. 服务发现
  5. 滚动更新
  6. 版本退回
  7. 秘钥和配置管理
  8. 存储编排
  9. 批处理

3、K8S集群架构组件

Master(主控节点)和node(工作节点)

  • master组件
    • apiserver
      • 集群统一入口以restful方式,交个etcd存储
    • scheduler
      • 节点调度,选择node节点引用部署
    • controller-manager
      • 处理集群中常规后台任务,一个资源对应一个控制器
    • etcd
      • 存储系统,用于保存集群相关的数据
  • node节点组件
    • kubelet
      • master派到node节点代表,管理本机容器
    • kube-proxy
      • 提供网络代理,负载均衡等操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vskIjzEc-1689748920563)(D:\software\Typora-WorkPlace\typora-user-images\image-20220507180216785.png)]

K8S核心概念

  • Pod
    • 最小部署单元
    • 一组容器的集合
    • 共享网络(这一组容器,共享网络)
    • 生命周期是短暂的
  • Controller
    • 确保预期的pod副本数量
    • 无状态应用部署
    • 有状态应用部署
    • 确保所有的node运行同一个pod
    • 一次性任务和定时任务
  • service
    • 定义一组pod的访问规则

第二部分、搭建K8S集群

  • 搭建k8s环境平台规划

    • 平台规划

      • 单master集群

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wLLA0Qv-1689748920564)(D:\software\Typora-WorkPlace\typora-user-images\image-20220507181527914.png)]

      • 多master集群

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hBeOurIU-1689748920565)(D:\software\Typora-WorkPlace\typora-user-images\image-20220507181921558.png)]

  • 服务器硬件配置要求

    • 测试环境

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSKKf4zG-1689748920565)(D:\software\Typora-WorkPlace\typora-user-images\image-20220507182336686.png)]
  • 搭建k8s集群部署方式

    • kubeadm
      • 官网
      • k8s-master:192.168.118.100
      • k8s-node1:192.168.118.101
      • k8s-node2:192.168.118.102
    • 二进制包

一、使用kubeadm方式搭建k8s集群

1、安装三台虚拟机。安装操作系统centos7

2、对三个安装之后的操作系统进行初始化操作

  • 关闭防火墙

    • systemctl stop firewalld
      systemctl disable firewalld  
      
      systemctl status firewalld
      systemctl start firewalld
      
  • 关闭selinux

    • sed -i 's/enforing/disabled/' /etc/selinux/config   #永久
      setenforce 0    #临时
      
  • 关闭swap

    • swapoff -a   #临时
      sed -ri 's/.*swap.*/#&/' /etc/fstab   #永久
      #==========================
      
      vim /etc/fstab
      # /dev/mapper/centos-swap swap                    swap    defaults        0 0
      
  • 根据规划修改主机名

    • #给主机命名
      hostnamectl set-hostname <hostname>
      
      192.168.118.100 k8s-master
      192.168.118.101 k8s-node1
      192.168.118.102 k8s-node2
      #192.168.118.103 paddy3
      #192.168.118.104 paddy4
      # 新增域名解析
      199.232.28.133 raw.githubusercontent.com
      199.232.68.133 user-images.githubusercontent.com
      199.232.68.133 avatars2.githubusercontent.com
      199.232.68.133 avatars1.githubusercontent.com
      
      
    • 配置主机网络

    • TYPE="Ethernet"
      PROXY_METHOD="none"
      BROWSER_ONLY="no"
      BOOTPROTO="static"
      DEFROUTE="yes"
      IPV4_FAILURE_FATAL="no"
      IPV6INIT="yes"
      IPV6_AUTOCONF="yes"
      IPV6_DEFROUTE="yes"
      IPV6_FAILURE_FATAL="no"
      IPV6_ADDR_GEN_MODE="stable-privacy"
      NAME="ens33"
      UUID="3d366597-c034-46a5-aec9-71c8310423da"
      DEVICE="ens33"
      ONBOOT="yes"
      ZONE=public
      #ip地址
      IPADDR=192.168.118.100
      #网关
      GATEWAY=192.168.118.2
      #域名解析器
      DNS1=192.168.118.2
      
  • 在master中修改hosts文件

  • 将桥接的IPv4流量传递到iptables的链

    • #cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
      #br_netfilter
      #EOF
      
      cat > /etc/sysctl.d/k8s.cfg << EOF 
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1 
      EOF
      
      sysctl --system   #生效
      
      # cat > /etc/sysctl.d/k8s.cfg << EOF
      # net.bridge.bridge-nf-call-ip6tables = 1
      # net.bridge.bridge-nf-call-iptables = 1
      # EOF
      
  • 时间同步

    • yum install ntpdate -y
      ntpdate time.windows.com
      
      
      
      ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      

3、所有节点安装docker/kubeadm/kubelet

  • 卸载旧版本docker

    • yum remove docker-ce docker-ce-cli  containerd
      
  • 安装docker,配置docker的源

    • $ yum -y install wget
      $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
      $ yum -y install docker-ce-18.06.1.ce-3.el7
      $ systemctl enable docker && systemctl start docker
      $ docker --version
      
      $ cat > /etc/docker/daemon.json << EOF
      {
      "registry-mirrors":[ "https://b9pmyelo.mirrors.aliyun.com"]
      }
      EOF
      
      systemctl restart docker
      
      #更换docker下载源地址:
      vi /etc/docker/daemon.json
      {
          "registry-mirrors" : [
          "https://registry.docker-cn.com",
          "https://docker.mirrors.ustc.edu.cn",
          "http://hub-mirror.c.163.com",
          "https://cr.console.aliyun.com/",
          "https://registry.hub.docker.com"
        ]
      }
      
    
  • 添加阿里云YUN软件源

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

4、安装kubeadm、kubelet、lubectl

  • yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
    systemctl enable kubelet
    
    
    
    ######################
    systemctl start kubelet
    systemctl status kubelet  #查看kubelet状态
    
    #卸载
    yum remove -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
    

5、部署Kubernets Master

  • master执行

  • #--service-cidr=10.96.0.0/12  地址随机设置,不冲突就可以
    #--pod-network-cidr=10.244.0.0/16  
    #=========================================
    $ kubeadm init --kubernetes-version=1.18.0 --apiserver-advertise-address=192.168.253.100  --image-repository registry.aliyuncs.com/google_containers  --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
    #===============================
    
    kubeadm init --apiserver-advertise-address=192.168.118.100 --image-repository resgistry.aliyuncs.com/google_containers --kubernetes-version=v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 
    
  • echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
    
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9es3AP0K-1689748920565)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508102805130.png)]

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-14hUoley-1689748920565)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508103028962.png)]

  • 默认的拉去镜像地址k8s.gcr.io国内无法访问,指定使用阿里云镜像仓库

  • 配置环境变量

    • vim /etc/profile
      # 在结尾加上
      export KUBECONFIG=/etc/kubernetes/admin.conf
      # 更新配置
      source /etc/profile
      
    
    
  • 使用kubectl工具

    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 nodes
    
#在Master节点获取join命令参数
kubeadm join 192.168.253.100:6443 --token 7onus4.n71s6zdr3s5h2mpi --discovery-token-ca-cert-hash sha256:bc3015592b803c63dabfb83a0f1a3176107262ec2f049629f8fe26ee3878bc6b

#解决问题
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
  • 在node中执行jion命令

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BwFqeW0S-1689748920566)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508105500439.png)]

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7CaoaYVm-1689748920566)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508111214858.png)]

  • 删除节点及配置文件

    • # 不可调度
      kubectl cordon k8s-node2 
      # 可调度
      kubectl uncordon k8s-node2
      # 驱逐节点
      kubectl drain k8s-node3 --delete-local-data --force --ignore-daemonsets
      
      # 删除节点
      kubectl delete node k8s-node2
      
      
      systemctl stop kubelet
      systemctl disable kubelet
      
  • 当删除托管容器时 kubeadm 阻塞

    • 一个可行的解决方案是重新启动 Docker 服务,然后重新运行 kubeadm reset

    • sudo systemctl restart docker.service
      sudo kubeadm reset
      

6、部署CNI网络插件

  • #网络组件
    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
  
- 默认镜像地址无法访问,sed命令修改为docker hub镜像仓库
  kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yaml
  
  kubectl get pods -n kube-system
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v8hu0L1t-1689748920566)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508182019373.png)]

  • 无法访问地址解决方法

  • vi /etc/hosts 
    
    ###增加下面的解析
    199.232.68.133 raw.githubusercontent.com
    199.232.68.133 user-images.githubusercontent.com
    199.232.68.133 avatars2.githubusercontent.com
    199.232.68.133 avatars1.githubusercontent.com
    
    

7、测试kubernetes集群

  • 在kubernetes集群中创建一个pod,验证是否正常运行

  • kubectl create deployment nginx --image=nginx
    kubectl expose deployment nginx --port=80 --type=NodePort
    
    kubectl get pod,svc
    
    

访问地址:http://NodeIP:port

http://192.168.253.101:31774

8、安装总结:

使用kubeadmin方式搭建k8s集群

  1. 安装三台虚拟机,安装操作系统CentOS7
  2. 对三个安装之后操作系统进行初始化操作
  3. 在三个节点安装docker、kubelet、kubeadm、kubectl
  4. 在master节点执行kubeadm init命令进行初始化
  5. 在node节点上执行kubeadmin join命令把node节点添加到当前集群里面
  6. 配置网络插件

二、kubernetes集群搭建(二进制方式)

1、安装要求:

在开始之前部署Kubernetes集群集群需要满足以下几个条件

  • 一台或多台机器。操作系统CentOS7
  • 硬件配置,2G,2CPU,硬盘最低30G
  • 集群所有机器之间网络互通
  • 可以访问万网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
  • 机制swap分区

2、准备环境

  1. 软件环境虚拟机
# 虚拟机环境
192.168.118.103 m1
192.168.118.104 n1
  1. 操作系统初始化(和kubeadm一下)

  2. 为etcd和apiserver自签证书

    • 集群内部证书
    • 外部访问需要证书
  3. 部署etcd集群

  4. 部署master组件

    • kube-apiserver,kube-controller-manager,kube-scheduler,docker,etcd
  5. 部署node组件

    • kubelet,kube-proxy,docker,etcd
  6. 部署集群网络

3、生成SSL证书

  1. 下载地址
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64

chmod +x cfssl_linux-amd64
chmod +x cfssljson_linux-amd64
chmod +x cfssl-certinfo_linux-amd64

mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo


  1. 创建 ETCD 证书
cat << EOF | tee ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF
  1. 创建 ETCD CA 配置文件
cat << EOF | tee ca-csr.json
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF
  1. 创建 ETCD Server 证书
cat << EOF | tee server-csr.json
{
    "CN": "etcd",
    "hosts": [
    "192.168.118.103",
    "192.168.118.104"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF
  1. 生成 ETCD CA 证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
  1. 创建 Kubernetes CA 证书
cat << EOF | tee ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF
cat << EOF | tee ca-csr.json
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Shenzhen",
            "ST": "Shenzhen",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF


cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
  1. 生成API_SERVER证书
cat << EOF | tee server-csr.json
{
    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",
      "127.0.0.1",
      "192.168.118.103",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Shenzhen",
            "ST": "Shenzhen",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF


cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
  1. 创建 Kubernetes Proxy 证书
cat << EOF | tee kube-proxy-csr.json
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "Shenzhen",
      "ST": "Shenzhen",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF



cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
  1. ssh-key认证

# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FQjjiRDp8IKGT+UDM+GbQLBzF3DqDJ+pKnMIcHGyO/o root@qas-k8s-master01
The key's randomart image is:
+---[RSA 2048]----+
|o.==o o. ..      |
|ooB+o+ o.  .     |
|B++@o o   .      |
|=X**o    .       |
|o=O. .  S        |
|..+              |
|oo .             |
|* .              |
|o+E              |
+----[SHA256]-----+



# ssh-copy-id 192.168.118.104

4、部署ETCD

  1. 下载安装文件
wget https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
  1. 解压安装文件
tar -xvf etcd-v3.3.10-linux-amd64.tar.gz
cd etcd-v3.3.10-linux-amd64/
cp etcd etcdctl /root/etcd/bin/
  1. etcd.conf文件编写
vim /opt/etcd/cfg/etcd.conf 	

#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.118.103:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.118.103:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.118.103:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.118.103:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.118.103:2380,etcd02=https://192.168.118.104:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
  1. 创建 etcd的 systemd unit 文件
vim /root/etcd.service 

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/opt/etcd/cfg/etcd.conf
ExecStart=/opt/etcd/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \
--initial-cluster-state=new \
--cert-file=/opt/etcd/ssl/server.pem \
--key-file=/opt/etcd/ssl/server-key.pem \
--peer-cert-file=/opt/etcd/ssl/server.pem \
--peer-key-file=/opt/etcd/ssl/server-key.pem \
--trusted-ca-file=/opt/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
  1. 配置文件复制到其他节点
#/root/etcd 复制到/opt/etcd/
cp -r /root/etcd /opt/etcd/


scp -r etcd root@192.168.118.104:/opt/
  1. 启动ETCD并设置开机启动
systemctl daemon-reload

systemctl start etcd

systemctl enable etcd

三、kubernetes集群命令行工具kubectl

1、kubectl概述

kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。

2、kubectl命令的语法:

kubectl [command] [TYPE] [NAME] [flags]

command:指定要对资源执行的操作,create、get、describe和delete

TYPE:指定资源类型,资源类型是大小写敏感的,开发者可能够以单数、复数、和缩写的形式。例如

kubectl get  pod/nginx-f89759699-bb8jp
kubectl get  pods/nginx-f89759699-bb8jp
kubectl get  po/nginx-f89759699-bb8jp

NMAE:资源名称

flags:指定可选的承诺书。例如,-s或者-server参数指定kubernetes API server的地址和端口

3、kubectl --help获取更多信息

kubectl --help

kubectl get --help

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

kubectl get pod,svc
kubectl get cs

kubectl apply -f

四、YAML文件

资源文件清单

资源编排

1、语法格式

  • 通过缩进表示层级关系
  • 不能使用tab键缩进,只能用空格缩进
  • 一般开头缩进两个空格
  • 字符后缩进一个空格,比如冒号,逗号等之后
  • 使用—三个横杠表示新的yaml文件的开始
  • 使用#表示注释

2、yaml文件组成部分

  • 控制器定义
  • 被控制对象
#控制器定义:
apiVersion:API版本
kind:资源类型
metadata:资源元数据
spec:资源规格
replicas:副本数量
selector:标签选择器
template:Pod模板
metadata:Pod元数据
spec:Pod规格
containers:容器配置
#被控制的对象:

3、常用字段含义

4、如何快速编写YAML文件

  • 第一种 使用kubectl create命令生成yaml文件
kubectl create deployment web --image=nginx -o yaml --dry-run > my1.yaml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQCfa4px-1689748920567)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517144246539.png)]

  • 第二种 使用kubectl get 命令导出yaml文件
kubectl get deploy

kubectl get deploy nginx -o=yaml --export > my2.yaml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uuD1ZqvQ-1689748920567)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517144554902.png)]

五、kubernetes核心技术-Pod

1、Pod概述

  • Pod是k8s系统中可以创建和管理的最小单元(最小的部署单元)
  • Pod是由一个或者多个container组成的(一组容器的集合)
  • 一个Pod中的容器共享网络命名空间
  • Pod是短暂的

2、Pod存在的意义

  • 创建容器使用docker,一个docker对应是一个容器,一个容器有进程,一个容器运行一个应用程序
  • Pod是一个多进程设计,运行多个应用程序
    • 一个pod有多个容器,一个容器里面运行一个应用程序
  • Pod存在为了亲密性应用
    • 两个应用之间进行交互
    • 网络之间的调用
    • 两个应用需要频繁调用

3、Pod的实现机制

  • 共享网络机制

    • 容器之间相互隔离的
      • namespace
      • group
    • 前提条件
      • 容器在同一个ns(namespace)里面
    • pod实现共享网络机制(IP MAC PORT)
      • 首先创建pause info容器
      • 业务容器1 加入info容器
      • 业务容器2 加入info容器
    • 共享网络:通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间(namespace)中,可以实现网络共享
  • 共享存储机制

    • Volumn数据卷(持久化存储)
    • Pod持久化数据
      • 日志数据
      • 业务数据
    • 共享存储:引入数据卷概念Volumn,使用数据卷进行持久化存储
  • Pod镜像拉取策略

    • IfNotPresent:默认值,镜像在宿主机上不存在是才拉取
    • Always:每次创建Pod都会重新拉取一次镜像
    • never:Pod永远不会主动拉取这个镜像
  • Pod资源限制

    • requests:调度限制
    • limits:最大
  • Pod重启机制

    • Always:当容器终止退出后,总是重启容器,默认策略
    • OnFailure: 当容器异常退出(退出代码非0)时,才重启容器
    • Never:当容器终止退出,从不重启容器
  • Pod健康检查

    • 容器检查,
      • java对内存溢出,无法通过检查容器发现
    • 应用层面监控检查
    • livenessProbe(存活检查)
      • 如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。
    • readinessProbe(就绪检查)
      • 如果检查失败,kubernetes会把Pod从service endpoints中提出
    • Prode支持以下三种检查方法
      • httpGet
        • 发送HTTP请求,返回200-400范围状态码为成功。
      • exec
        • 执行shell命令返回状态码是0为成功
      • tcpSocket
        • 发起TCP Socket建立成功

4、Pod(调度策略)

1、创建Pod流程
kubectl get pods -o wide

NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
nginx-f89759699-bb8jp   1/1     Running   3          8d    10.122.1.6   k8s-node1   <none>           <none>

mater节点:

  • create — apiserver — etcd

  • schduler — apiserver — etcd — 调度算法,把pod调度到某个节点上

node节点:

  • kubelet — apiserver — 读取etcd拿到分配给当前节点pod — docker创建容器
2、影响Pod调度(资源限制和节点选择器)
  • pod资源限制对pod调度产生影响
    • 根据request找到足够node节点进行调度
  • 节点选择器标签调度
    • 首先对节点创建标签
nodeSelector:
 env_role: dev 
#给node打标签
kubectl label node k8s-node1 env_role=prod
#查看标签
kubectl get nodes k8s-node1 --show-labels

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ELXQOU7y-1689748920567)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517170108065.png)]

  • 节点的亲和性

    • nodeAffinitty和之前nodeSelector基本一样的,根据节点上标签约束来决定Pod调度到那些节点上。

      • 应亲和性

        • 约束条件必须满足
      • 软亲和性

        • 尝试满足,不满足
      • 支持常用操作符:

        • In NotIn Exist Gt Lt DoseNotExists
  • 反亲和性

  • 污点

    • 基本介绍

      • nodeSelector和nodeAffinity:Pod调度到某些节点上,Pod里面属性,调度时实现
      • Taint污点:节点不做普通分配调度,是节点属性,
    • 应用的场景

      • 专用节点
      • 配置特点硬件节点
      • 基于Taint驱逐
    • 具体演示

      • 查看节点污点情况

      • kubectl describe node k8s-master | grep Taint
        Taints:             node-role.kubernetes.io/master:NoSchedule
        
        
        • 污点值:
          • NoSchedule:节点一定不被调度
          • PreferNoSchedule:尽量不被调度
          • NoExecute:不会调度,并且还会驱逐Node已有Pod
      • 为节点添加污点

      • #语法
        kubectl taint node [node] key=value:污点三个值
        #为node添加污点
        kubectl taint node k8s-node1 env_role=yes:NoSchedule
        #查看污点
        kubectl describe node k8s-node1 | grep Taint
        #创建pod
        kubectl create deployment web --image=nginx
        #生成多个pod
        kubectl scale deployment web --replicas=5
        #查看pod分布情况,污点效果,都分配到其他node
        kubectl get pods -o wide
        
        
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4AHCiWjl-1689748920568)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517173945758.png)]

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FUNm2lTH-1689748920568)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517173339497.png)]

      • 删除污点

      • #查看污点
         kubectl describe node k8s-node1 | grep Taint
        Taints:             env_role=yes:NoSchedule
        #删除污点
         kubectl taint node k8s-node1 env_role:NoSchedule-
        node/k8s-node1 untainted
        #查看污点是否删除
         kubectl describe node k8s-node1 | grep Taint
        Taints:             <none>
        
        
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L3OPQIRB-1689748920568)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517174607851.png)]

  • 污点容忍

    • spec:
       tolerations:
       - key: "key"
         operator: "Equal"
         value: "value"
         effact: "NoSchedule"
      

六、kubernetes核心技术-Controller(Deployment)

1、什么是controller

2、Pod和controller关系

3、Deployment控制器应用场景

4、yaml文件字段说明

5、Deployment控制器部署应用

6、Deployment升级回滚

7、弹性伸缩

1、什么是Controller

  • 在集群上管理和运行容器的对象

2、Pod和Controller关系

  • Pod是通过controller实现应用的运维,比如伸缩,滚动升级等等
  • PodheController之间通过label标签建立关系
  • 控制器(工作负载)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CV6Lph2p-1689748920569)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517183311842.png)]

3、Deployment应用场景

  • deployment部署无状态应用
  • 管理Pod和ReplicaSet(副本创建)
  • 部署,滚动升级等功能
    • 应用场景:web服务,微服务

4、使用deployment部署应用(yaml)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DyZXtfap-1689748920569)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517190542833.png)]

  • 导出yaml文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U90CbbKP-1689748920569)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517190711796.png)]

  • 使用yaml文件部署应用,并查看部署是否成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKvsY8ek-1689748920569)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517190808846.png)]

  • 对外发布(暴露对外端口号)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kF9DY1LK-1689748920570)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517191934669.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fn55ObeX-1689748920570)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517192035088.png)]

5、升级回滚和弹性伸缩

  • 应用升级命令
kubectl set image deployment web nginx=nginx:1.15

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7qS1dFr-1689748920570)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517192841903.png)]

  • 查看升级状态
#升级状态
kubectl rollout status deployment web

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yhnnTjVH-1689748920570)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517193310302.png)]

  • 应用回滚
    • 查看历史版本
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKphh7LV-1689748920571)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517193508289.png)]
    • 回滚到上一个版本
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmEGiZ2h-1689748920571)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517193739541.png)]
    • 回滚到指定版本
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OKwbXmPA-1689748920572)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517194038585.png)]
    • 弹性伸缩(提供更多的服务)
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4bEral6b-1689748920572)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517194345353.png)]
#应用回滚
#查看历史版本
kubectl rollout history deployment web
#回滚到上一个版本
kubectl rollout undo deployment web
#回滚到指定版本
kubectl rollout undo deployment web --to-revision=1
#弹性伸缩(提供更多的服务)
kubectl scale deployment web --replicas=10

七、kubernetes核心概念-Service

1、service存在的意义

  • 防止Pod失联(服务发现)
  • 定义一组Pod访问策略(负载均衡)

2、Pod和service关系

  • 根据label和selector标签建立关联
  • 通过service实现Pod的负载均衡

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2C6X78M9-1689748920573)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518174536963.png)]

3、常用的service类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xlOhHv8a-1689748920573)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518175014977.png)]

  • ClusterIP:集群内部使用
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-187owZ7r-1689748920573)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518181039831.png)]
  • NodePort:对外访问应用使用暴露端口
    • 修改service.yaml配置文件
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sCW9DJVs-1689748920574)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518181350988.png)]
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqy5pDiv-1689748920574)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518181303145.png)]
  • LoadBalancer:对外访问应用使用,公有云

node内网部署应用,外网一般不能访问到

  • 找到一台可以进行外网访问机器,安装nginx,反向代理。
    • 手动把可以访问节点添加到nginx里面
  • LoadBalancer:公有云,负载均衡控制器

八、kubernetes核心概念-Controller

1、无状态和有状态的区别

  • 无状态
    • 认为Pod都是一样的
    • 没有顺序的要求
    • 不用考虑在哪个node上运行,
    • 随意进行伸缩扩展
  • 有状态
    • 上面因素都需要考虑到
    • 让每个Pod都是独立的,保持pod启动顺序和唯一性
      • 唯一的网络标识符,持久存储
      • **有序,比如mysql主从

2、部署有状态的应用

  • 无头service

    • ClusterIP: none IP为空
  • StatefulSet部署有状态应用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hV3dN6bg-1689748920574)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518183716332.png)]

有状态配置文件

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: default
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
  • 根据配置文件部署应用
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbLCPc2z-1689748920574)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518184953127.png)]
  • 查看无头的service
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eksfN6vc-1689748920575)(D:\software\Typora-WorkPlace\typora-user-images\image-20220625162306747.png)]
  • deployment和statfulset的区别:有身份的(唯一标识)
    • 根据主机名+按照一定的规则生成域名
      • 每一个pod有唯一域名
      • 唯一域名
        • 格式:主机名称.service名称.名称空间.svc.cluster.local
        • nginx-statefulset-0.nginx.default.svc.cluster.local

3、部署守护进程

  • 在每个node中运行一个pod,新加入的node也同样运行在一个pod里面

    • 例子:在每个node节点安装数据采集工具

    • ClusterIP: none IP为空

  • StatefulSet部署有状态应用

[外链图片转存中…(img-hV3dN6bg-1689748920574)]

有状态配置文件

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: default
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
  • 根据配置文件部署应用
  • [外链图片转存中…(img-zbLCPc2z-1689748920574)]
  • 查看无头的service
    • [外链图片转存中…(img-eksfN6vc-1689748920575)]
  • deployment和statfulset的区别:有身份的(唯一标识)
    • 根据主机名+按照一定的规则生成域名
      • 每一个pod有唯一域名
      • 唯一域名
        • 格式:主机名称.service名称.名称空间.svc.cluster.local
        • nginx-statefulset-0.nginx.default.svc.cluster.local

3、部署守护进程

  • 在每个node中运行一个pod,新加入的node也同样运行在一个pod里面
    • 例子:在每个node节点安装数据采集工具
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值