美文网首页
k8s容器编排

k8s容器编排

作者: 唯爱熊 | 来源:发表于2020-03-06 22:25 被阅读0次

    1.k8s集群的安装(kubeadm安装)

    1.1 k8s的架构

    从系统架构来看,k8s分为2个节点

    Master 控制节点 指挥官
    Node 工作节点 干活的

    1.Master节点组成

    API Server :提供k8s API接口
    主要处理Rest操作以及更新Etcd中的对象
    是所有资源增删改查的唯一入口。

    Scheduler:资源调度器
    根据etcd里的节点资源状态决定将Pod绑定到哪个Node上

    Controller Manager
    负责保障pod的健康存在
    资源对象的自动化控制中心,Kubernetes集群有很多控制器。

    Etcd
    这个是Kubernetes集群的数据库
    所有持久化的状态信息存储在Etcd中

    2.Node节点的组成

    Docker Engine
    负责节点容器的管理工作,最终创建出来的是一个Docker容器。

    kubelet
    安装在Node上的代理服务,用来管理Pods以及容器/镜像/Volume等,实现对集群对节点的管理。

    kube-proxy
    安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。

    除了核心组件,还有一些推荐的Add-ons:

    组件名称 说明
    kube-dns 负责为整个集群提供DNS服务
    Ingress Controller 为服务提供外网入口
    Heapster 提供资源监控
    Dashboard 提供GUI
    Federation 提供跨可用区的集群
    Fluentd-elasticsearch 提供集群日志采集、存储与查询

    1.2实验环境准备

    1.初始化操作:
    干净环境
    配置主机名
    配置host解析
    关闭防火墙
    关闭SELinux
    配置时间同步
    更新好阿里源
    确保网络通畅
    关闭SWAP分区
    2.配置信息:
    主机名 IP地址 推荐配置
    node1 10.0.0.11 1C4G40G
    node2 10.0.0.12 1C4G40G
    node3 10.0.0.13 1C4G40G
    所有节点需要做hosts解析

    [root@node1 ~]# vim /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.0.0.11 node1
    10.0.0.12 node2
    10.0.0.13 node3
    

    1.3 安装指定版本的docker

    1.配置阿里源

    cd /etc/yum.repos.d/
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    2.下载指定版本的docker

    yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7
    

    3.配置docker镜像加速

    mkdir /etc/docker
    cat > /etc/docker/daemon.json <<EOF
        {
          "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
          "exec-opts": ["native.cgroupdriver=systemd"]
        }
    EOF
    

    4.启动

    systemctl enable docker && systemctl start docker
    

    5.检查版本

    docker -v
    

    1.4部署kubeadm和kubelet

    注意:所有节点都需要安装
    1.设置k8s国内yum仓库

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

    2.安装kubeadm

    yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 ipvsadm
    

    3.设置k8s禁止使用swap

    cat > /etc/sysconfig/kubelet<<EOF
    KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"
    EOF
    

    4.设置内核参数

    cat >  /etc/sysctl.d/k8s.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    #加载生效
    sysctl --system
    

    5.设置kubelet开机启动

    systemctl enable kubelet && systemctl start kubelet
    

    6.加载IPVS模块

    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 +x /etc/sysconfig/modules/ipvs.modules
    #加载模块
    source /etc/sysconfig/modules/ipvs.modules
    #检测结果
    [root@node1 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv
    ip_vs_sh               12688  0 
    ip_vs_wrr              12697  0 
    ip_vs_rr               12600  0 
    ip_vs                 145497  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
    nf_conntrack_ipv4      15053  2 
    nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
    nf_conntrack          133095  7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
    libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack
    

    1.5初始化集群部署Master

    注意!只在master节点运行!!!
    https://v1-16.docs.kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
    0.安装规划
    节点规划
    node1 master节点 API Server controlle scheduler kube-proxy etcd
    node2
    node3

    IP规划
    POD IP. 10.2.0.0
    Cluster IP. 10.1.0.0
    Node IP. 10.0.0.0

    1.初始化命令

    kubeadm init \
    --apiserver-advertise-address=10.0.0.11 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version v1.16.2 \
    --service-cidr=10.1.0.0/16 \
    --pod-network-cidr=10.2.0.0/16 \
    --service-dns-domain=cluster.local \
    --ignore-preflight-errors=Swap \
    --ignore-preflight-errors=NumCPU
    

    执行完成后会有输出,这是node节点加入k8s集群的命令

    kubeadm join 10.0.0.11:6443 --token 24yya0.hwl78tnxu6sc4c3z
    --discovery-token-ca-cert-hash sha256:3a31131cf8752bdebe67e1539ad7a625b94e5017b37c0ae8d7f877799b962627

    ===============================================

    2.为kubectl准备kubeconfig

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

    3.获取node节点信息

    [root@node1 ~]# kubectl get nodes
    NAME    STATUS     ROLES    AGE   VERSION
    node1   NotReady   master   15m   v1.16.
    

    4.支持命令补全

    yum install bash-completion -y
    source /usr/share/bash-completion/bash_completion
    source <(kubectl completion bash)
    kubectl completion bash >/etc/bash_completion.d/kubectl
    

    5.设置kube-proxy使用ipvs模式

    执行命令,然后将mode: ""修改为mode: "ipvs"然后保存退出

    kubectl edit cm kube-proxy -n kube-system
    

    重启kube-proxy(删除kube-proxy,重新创建,类似修改重载服务)

    kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
    

    查看pod信息

    kubectl get -n kube-system pod|grep "kube-proxy" 
    

    检查日志,如果出现IPVS rr就表示成功

    [root@node1 ~]# kubectl -n kube-system logs -f kube-proxy-vzg52
    I0305 14:55:27.188416       1 node.go:135] Successfully retrieved node IP: 10.0.0.11
    I0305 14:55:27.188451       1 server_others.go:176] Using ipvs Proxier.
    W0305 14:55:27.188647       1 proxier.go:420] IPVS scheduler not specified, use rr by default
    

    检查IPVS规则

    [root@node1 ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  10.1.0.1:443 rr
      -> 10.0.0.11:6443               Masq    1      0          0         
    TCP  10.1.0.10:53 rr
    TCP  10.1.0.10:9153 rr
    UDP  10.1.0.10:53 rr
    

    1.6 部署网络插件

    注意!只在master节点上安装部署!!!

    1.部署Flannel网络插件

    git clone --depth 1 https://github.com/coreos/flannel.git
    

    2.修改资源配置清单

    cd flannel/Documentation/
    vim kube-flannel.yml
    egrep -n "10.2.0.0|mirror|eth0" kube-flannel.yml
    128:      "Network": "10.2.0.0/16",
    172:        image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
    186:        image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
    192:        - --iface=eth0
    

    3.应用资源配置清单

    kubectl create -f kube-flannel.yml
    [root@node1 ~/flannel/Documentation]# kubectl create -f kube-flannel.yml
    podsecuritypolicy.policy/psp.flannel.unprivileged created
    clusterrole.rbac.authorization.k8s.io/flannel created
    clusterrolebinding.rbac.authorization.k8s.io/flannel created
    serviceaccount/flannel created
    configmap/kube-flannel-cfg created
    daemonset.apps/kube-flannel-ds-amd64 created
    daemonset.apps/kube-flannel-ds-arm64 created
    daemonset.apps/kube-flannel-ds-arm created
    daemonset.apps/kube-flannel-ds-ppc64le created
    

    4.检查pod运行状态,等一会应该全是running

    [root@node1 ~/flannel/Documentation]# kubectl -n kube-system get pod
    NAME                            READY   STATUS    RESTARTS   AGE
    coredns-58cc8c89f4-bd6gz        0/1     Running   0          48m
    coredns-58cc8c89f4-jbgss        1/1     Running   0          48m
    etcd-node1                      1/1     Running   0          47m
    kube-apiserver-node1            1/1     Running   0          47m
    kube-controller-manager-node1   1/1     Running   0          47m
    kube-flannel-ds-amd64-ct5tn     1/1     Running   0          34s
    kube-proxy-vzg52                1/1     Running   0          15m
    kube-scheduler-node1            1/1     Running   0          47m
    

    1.7部署Node节点

    1.在master节点上输出增加节点的命令

    kubeadm token create --print-join-command
    

    2.在node2和node3节点执行加入集群的命令 每个人的token不一样

    kubeadm join 10.0.0.11:6443 --token 24yya0.hwl78tnxu6sc4c3z
    --discovery-token-ca-cert-hash sha256:3a31131cf8752bdebe67e1539ad7a625b94e5017b37c0ae8d7f877799b962627
    ===============================================
    3.在node1节点上查看状态

    [root@node1 ~]# kubectl get nodes
    NAME    STATUS     ROLES    AGE   VERSION
    node1   Ready      master   53m   v1.16.2
    node2   NotReady   <none>   47s   v1.16.2
    node3   Ready      <none>   42s   v1.16.2
    

    4.给节点打标签
    主节点操作:

    [root@node1 ~]# kubectl label nodes node2 node-role.kubernetes.io/node=
    node/node2 labeled
    [root@node1 ~]# kubectl label nodes node3 node-role.kubernetes.io/node=
    node/node3 labeled
    

    5.再次查看节点状态

    [root@node1 ~]# kubectl get nodes
    NAME    STATUS     ROLES    AGE     VERSION
    node1   Ready      master   55m     v1.16.2
    node2   NotReady   node     2m42s   v1.16.2
    node3   Ready      node     2m37s   v1.16.2
    

    至此k8s集群搭建完成,这种黑盒安装不利于了解其组成架构,不利于学习,学习还是使用yum一步步安装。

    1.8配置master为镜像仓库

    安装docker

    1.配置阿里源

    cd /etc/yum.repos.d/
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    2.下载指定版本的docker

    yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7
    

    3.配置docker镜像加速

    mkdir /etc/docker
    cat > /etc/docker/daemon.json <<EOF
        {
          "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
          "exec-opts": ["native.cgroupdriver=systemd"]
        }
    EOF
    

    4.启动

    systemctl enable docker && systemctl start docker
    

    5.检查版本

    docker -v
    
    安装harbor

    1.下载harbor

    wget https://github.com/goharbor/harbor/releases/download/v1.9.3/harbor-offline-installer-v1.9.3.tgz
    

    2.在node4上安装harbor

    cd /opt/
    tar zxf harbor-offline-installer-v1.9.0-rc1.tgz
    cd harbor/
    

    3.编辑harbor配置文件

    vim harbor.yml
    ...
    hostname: 10.0.0.14
    harbor_admin_password: 123456
    data_volume: /data/harbor
    ...
    

    4.执行安装

    yum install docker-compose -y
    ./install.sh
    

    5.浏览器访问

    http://10.0.0.14
    admin
    123456
    

    6.建立镜像仓库
    这里有2种访问级别:
    公开:任何人都可以直接访问并下载镜像
    私有:登陆授权后才允许下载镜像


    .使用harbor作为k8s私有仓库

    1.创建镜像仓库


    2.所有节点都配置docker信任harbor仓库并重启docker

    cat >/etc/docker/daemon.json <<EOF
        {
          "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
          "exec-opts": ["native.cgroupdriver=systemd"],
          "insecure-registries" : ["http://10.0.0.14"]
        }
    EOF
    systemctl restart docker
    

    3.为镜像打标签

    [root@node2 ~]# docker tag d5cea958d330 10.0.0.14/k8s/mysql:5.7
    [root@node2 ~]# docker tag a29e200a18e9 10.0.0.14/k8s/tomcat-app:v1
    

    4.登录harbor并推送镜像到harbor

    [root@node2 ~]# docker login 10.0.0.14
    Username: admin
    Password: 
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    [root@node2 ~]# docker push 10.0.0.14/k8s/tomcat-app:v1
    The push refers to repository [10.0.0.14/k8s/tomcat-app]
    fe9a890c4f24: Pushed 
    5f70bf18a086: Pushed 
    a072f755a133: Pushed 
    6d0267f8a9fd: Pushed 
    7bb92eb08c02: Pushed 
    d8ba5f179687: Pushed 
    2275023dea33: Pushed 
    d490458a60cb: Pushed 
    bb3e02b5a488: Pushed 
    3b7a0c95e085: Pushed 
    02adacdfda2f: Pushed 
    d2c5e3a8d3d3: Pushed 
    4dcab49015d4: Pushed 
    v1: digest: sha256:565bb4e52ac67b4d37feed9ea4626b786f23e0871451587c7187683532a6188f size: 5719
    [root@node2 ~]# docker push 10.0.0.14/k8s/mysql:5.7
    The push refers to repository [10.0.0.14/k8s/mysql]
    ef78375f166a: Pushed 
    549184ef4a0e: Pushed 
    3be346044c35: Pushed 
    c7c9b9502281: Pushed 
    80c697004ac9: Pushed 
    f24603cb3885: Pushed 
    cee57cdf5101: Pushed 
    1a527f11e03e: Pushed 
    4dac9b6b28ce: Pushed 
    605f8f2fe1e5: Pushed 
    e0db3ba0aaea: Pushed 
    5.7: digest: sha256:1be1f2cbd2c18563b167ffda45f67c5b0afb1bfe6a77cbc506306836fb1317b5 size: 2622
    
    

    5.查看docker登陆的密码文件

    [root@node1 ~]# cat /root/.docker/config.json
    {
        "auths": {
            "10.0.0.14": {
                "auth": "YWRtaW46SGFyYm9yMTIzNDU="
            }
        },
        "HttpHeaders": {
            "User-Agent": "Docker-Client/18.09.7 (linux)"
        }
    }
    

    6.将docker密码文件解码成base64编码

    [root@node1 ~/demo]# cat /root/.docker/config.json|base64
    ewoJImF1dGhzIjogewoJCSIxMC4wLjAuMTQiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVlt
    OXlNVEl6TkRVPSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRv
    Y2tlci1DbGllbnQvMTguMDkuNyAobGludXgpIgoJfQp9
    

    7.创建并应用docker登陆的Secret资源
    注意!!!
    1.dockerconfigjson: xxx直接写base64的编码,不需要换行
    2.base64编码是一整行,不是好几行
    3.最后的type字段不能少

    [root@node1 ~]# vim harbor-secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: harbor-secret
    data:
     .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxMC4wLjAuMTQiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVlt
    OXlNVEl6TkRVPSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRv
    Y2tlci1DbGllbnQvMTguMDkuNyAobGludXgpIgoJfQp9
    type: kubernetes.io/dockerconfigjson
    

    8.应用资源配置清单并查看

    [root@node1 ~]# kubectl create -f harbor-secret.yaml
    secret/harbor-secret created
    [root@node1 ~]# kubectl get secrets 
    NAME                  TYPE                                  DATA   AGE
    default-token-vz4d9   kubernetes.io/service-account-token   3      30h
    harbor-secret         kubernetes.io/dockerconfigjson        1      14s
    

    2什么是k8s,k8s有什么功能?

    k8s是一个docker集群的管理工具

    2.1 k8s的核心功能

    自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。

    弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量

    服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。

    滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。

    2.2 k8s的历史

    2014年 docker容器编排工具,立项

    2015年7月 发布kubernetes 1.0, 加入cncf基金会

    2016年,kubernetes干掉两个对手,docker swarm,mesos 1.2版

    2017年 1.5

    2018年 k8s 从cncf基金会 毕业项目

    2019年: 1.13, 1.14 ,1.15

    cncf cloud native compute foundation

    kubernetes (k8s): 希腊语 舵手,领航 容器编排领域,

    谷歌15年容器使用经验,borg容器管理平台,使用golang重构borg,kubernetes

    2.3 k8s的安装

    yum安装 1.5 最容易安装成功,最适合学习的

    源码编译安装---难度最大 可以安装最新版

    二进制安装---步骤繁琐 可以安装最新版 shell,ansible,saltstack

    kubeadm 安装最容易, 网络 可以安装最新版

    minikube 适合开发人员体验k8s, 网络

    2.4 k8s的应用场景

    k8s最适合跑微服务项目!

    3k8s常用的资源

    1.POD
    POD是k8s的最小资源单位
    POD的IP地址是随机的,删除POD会改变IP
    POD都有一个基础容器
    一个POD内可以由一个或多个容器组成
    一个POD内的容器共享根容器的网络命名空间
    一个POD的内的网络地址由根容器提供

    2.Controller
    用来管理POD
    控制器的种类有很多

    • RC Replication Controller 控制POD有多个副本
    • RS ReplicaSet RC控制的升级版
    • Deployment 推荐使用,功能更强大,包含了RS控制器
    • DaemonSet 保证所有的Node上有且只有一个Pod在运行
    • StatefulSet 有状态的应用,为Pod提供唯一的标识,它可以保证部署和scale的顺序

    3.Service提供网络代理负债均衡
    NodeIP
    CluterIP
    POD IP

    3.1 创建pod资源

    创建资源的方法
    apiserver仅能接受json格式的资源定义 ,yaml格式提供的清单,apiserver可以自动将其转换为json格式再提交。
    k8s yaml的主要组成:

    #查看资源清单所需的字段
    [root@node1 ~]# kubectl explain pod
    
    apiVersion: v1  api版本
    kind: pod   资源类型
    metadata:   属性
    spec:       详细
    #查看资源清单嵌套的命令
      kubectl explain pod
      kubectl explain pod.spec
      kubectl explain pod.spec.volumes
    

    使用命令行创建一个pod

    #创建pod
    kubectl create deployment nginx --image=nginx:alpine
    #查看pod详细信息
    kubectl get pod -o wide
    #将刚才创建的pod配置到处成yaml格式
    kubectl get pod -o yaml > nginx-pod.yaml
    
    [root@node1 ~]# vim nginx-pod.yaml
    apiVersion: v1  #api版本
    kind: Pod   #资源类型
    metadata:   #元数据
      name: nginx   #元数据名称
      labels:   #pod标签
        app: nginx   
    spec:       
      containers:   #容器的特性
      - name: nginx #容器名称
        image: nginx:alpine #容器的镜像名称
        imagePullPolicy: IfNotPresent  #容器的拉取策略
        ports:      #容器端口
        - name: http 
          containerPort: 80  #容器暴露的端口
    

    根据应用资源配置清单创建pod

    kubectl create -f nginx-pod.yaml
    

    查看pod信息

    kubectl get pod -o wide
    

    查看pod创建过程的详细信息

    kubectl describe pod nginx
    

    pod资源:至少由两个容器组成,pod基础容器和业务容器组成(最多1+4)
    pod配置文件2:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: 10.0.0.14/nginx:1.14
          ports:
            - containerPort: 80
        - name: busybox
          image: 10.0.0.14/busybox:latest
          command: ["sleep","10000"] #间隔时间
    

    Node打标签

    说明:通过nodeSelector来选择node标签在特定节点生成pod,默认是根据etcd里的节点资源状态决定将Pod绑定到哪个Node上。

    1.查看node的标签

    kubectl get node --show-labels
    

    2.给node打标签

    kubectl label nodes node2 CPU=Xeon
    kubectl label nodes node3 disktype=ssd
    

    3.编辑POD资源配置清单,使用node标签选择器

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.0
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
      nodeSelector:
        #CPU: Xeon
        disktype: SSD
    

    4.删除容器重新创建

    kubectl delete pod nginx
    kubectl create -f nginx-pod.yaml
    

    5.查看结果

    kubectl get pod -o wide
    

    6.删除节点标签

    kubectl label nodes node2 CPU-
    kubectl label nodes node3 disktype-
    

    容器打标签

    1.标签说明
    一个标签可以给多个POD使用
    一个POD也可以拥有多个标签

    2.查看POD标签

      kubectl get pod --show-labels
    

    3.添加标签方法
    方法1:直接编辑资源配置清单:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        app: nginx
        release: beta
    

    方法2:命令行打标签

    kubectl label pods nginx release=beta
    kubectl label pods nginx job=linux
    kubectl get pod --show-labels  
    

    4.删除标签

    kubectl label pod nginx job- 
    kubectl get pod --show-labels
    

    5.实验: 生成2个POD,打上不同的标签,然后根据标签选择

    kubectl create deployment nginx --image=nginx:1.14.0
    kubectl get pod --show-labels
    kubectl label pods nginx-xxxxxxxx release=stable
    kubectl get pod --show-labels
    

    根据条件查看

    kubectl get pods -l release=beta --show-labels 
    kubectl get pods -l release=stable --show-labels 
    

    根据条件删除

    kubectl delete pod -l app=nginx
    

    3.2 ReplicationController资源

    rc:保证指定数量的pod始终存活,rc通过标签选择器来关联pod

    k8s资源的常见操作:

    kubectl create -f xxx.yaml 
    kubectl get pod|rc 
    kubectl describe pod nginx 
    kubectl delete pod nginx 或者kubectl delete -f xxx.yaml
    kubectl edit pod nginx
    

    创建一个rc

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: nginx
    spec:
      replicas: 5
      selector:
        app: myweb
      template:
        metadata:
          labels:
            app: myweb
        spec:
          containers:
          - name: myweb
            image: 10.0.0.14/nginx:1.14
            ports:
            - containerPort: 80
    

    rc的滚动升级 新建一个nginx-rc1.15.yaml

    升级 kubectl rolling-update nginx -f nginx-rc1.15.yaml --update-period=10s

    回滚 kubectl rolling-update nginx2 -f nginx-rc.yaml --update-period=1s


    3.3.编写RS控制器资源配置清单

    cat >nginx-rs.yaml <<EOF
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: nginx-rs
      namespace: default
    spec:
      replicas: 2 
      selector: 
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-pod
          labels: 
            app: nginx
        spec:
          containers:
          - name: nginx-containers
            image: nginx:1.14.0
            imagePullPolicy: IfNotPresent
            ports:
            - name: http
              containerPort: 80
    EOF
    

    2.应用RS资源配置清单

    kubectl create -f nginx-rs.yaml
    

    3.查看RS资源

    kubectl get rs 
    kubectl get pod -o wide 
    

    4.动态修改配置 扩容 收缩 升级

    kubectl edit rs nginx
    kubectl scale rs nginx --replicas=5
    

    5.修改yaml文件应用修改

    vim nginx-rs.yaml
    kubectl apply -f nginx-rs.yaml
    

    3.4deployment资源

    有rc在滚动升级之后,会造成服务访问中断,这是由于调用的标签需要手动修改,于是k8s引入了deployment资源,也是目前使用的pod资源。
    1.Deployment资源配置清单

    cat >nginx-dp.yaml<<EOF
    apiVersion: apps/v1
    kind: Deployment 
    metadata:
      name: nginx-deployment 
      namespace: default
    spec:
      replicas: 2 
      selector: 
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-pod
          labels: 
            app: nginx
        spec:
          containers:
          - name: nginx-containers
            image: nginx:1.14.0
            imagePullPolicy: IfNotPresent
            ports:
            - name: http
              containerPort: 80
    EOF
    

    2.应用资源配置清单

    kubectl create -f nginx-dp.yaml
    

    3.查看

    kubectl get pod -o wide
    kubectl get deployments.apps
    kubectl describe deployments.apps nginx-deployment
    

    4.更新版本
    方法1: 命令行根据资源配置清单修改镜像

    kubectl set image -f nginx-dp.yaml nginx-containers=nginx:1.16.0
    

    查看有没有更新

    kubectl get pod 
    kubectl describe deployments.apps nginx-deployment
    kubectl describe pod nginx-deployment-7c596b4d95-6ztld
    

    方法2: 命令行根据资源类型修改镜像
    打开2个窗口:
    第一个窗口监控pod状态

    kubectl get pod -w
    

    第二个窗口更新操作

    kubectl set image deployment nginx-deployment nginx-containers=nginx:1.14.0
    

    查看更新后的deployment信息

    kubectl describe deployments.apps nginx-deployment 
    ----------------------------------------------------
      Normal  ScalingReplicaSet  14m                  deployment-controller  Scaled up replica set nginx-deployment-7c596b4d95 to 1
      Normal  ScalingReplicaSet  14m                  deployment-controller  Scaled down replica set nginx-deployment-9c74bb6c7 to 1
      Normal  ScalingReplicaSet  14m                  deployment-controller  Scaled up replica set nginx-deployment-7c596b4d95 to 2
      Normal  ScalingReplicaSet  13m                  deployment-controller  Scaled down replica set nginx-deployment-9c74bb6c7 to 0
      Normal  ScalingReplicaSet  8m30s                deployment-controller  Scaled up replica set nginx-deployment-9c74bb6c7 to 1
      Normal  ScalingReplicaSet  8m29s (x2 over 32m)  deployment-controller  Scaled up replica set nginx-deployment-9c74bb6c7 to 2
      Normal  ScalingReplicaSet  8m29s                deployment-controller  Scaled down replica set nginx-deployment-7c596b4d95 to 1
      Normal  ScalingReplicaSet  8m28s                deployment-controller  Scaled down replica set nginx-deployment-7c596b4d95 to 0
    ----------------------------------------------------
    

    更新过程:

    nginx-deployment-7c596b4d95-8z7kf   #老的版本
    nginx-deployment-7c596b4d95-6ztld   #老的版本
    
    nginx-deployment-9c74bb6c7-pgfxz    0/1     Pending   
    nginx-deployment-9c74bb6c7-pgfxz    0/1     Pending
    nginx-deployment-9c74bb6c7-pgfxz    0/1     ContainerCreating  #拉取新版本镜像
    nginx-deployment-9c74bb6c7-pgfxz    1/1     Running            #运行新POD
    nginx-deployment-7c596b4d95-8z7kf   1/1     Terminating        #停止一个旧的POD
    nginx-deployment-9c74bb6c7-h7mk2    0/1     Pending            
    nginx-deployment-9c74bb6c7-h7mk2    0/1     Pending           
    nginx-deployment-9c74bb6c7-h7mk2    0/1     ContainerCreating  #拉取新版本镜像
    nginx-deployment-9c74bb6c7-h7mk2    1/1     Running            #运行新POD
    nginx-deployment-7c596b4d95-6ztld   1/1     Terminating        #停止一个旧的POD
    nginx-deployment-7c596b4d95-8z7kf   0/1     Terminating        #等待旧的POD结束
    nginx-deployment-7c596b4d95-6ztld   0/1     Terminating        #等待旧的POD结束
    

    查看滚动更新状态:

    kubectl rollout status deployment nginx-deployment
    

    5.回滚上一个版本

    kubectl describe deployments.apps nginx-deployment 
    kubectl rollout undo deployment nginx-deployment
    kubectl describe deployments.apps nginx-deployment 
    

    6.回滚到指定版本
    v1 1.14.0
    v2 1.15.0
    v3 1.16.0
    回滚到v1版本

    创建第一版 1.14.0

    kubectl create -f nginx-dp.yaml  --record
    

    更新第二版 1.15.0

    kubectl set image deployment nginx-deployment nginx-containers=nginx:1.15.0
    

    更新第三版 1.16.0

    kubectl set image deployment nginx-deployment nginx-containers=nginx:1.16.0
    

    查看所有历史版本

    kubectl rollout history deployment nginx-deployment
    

    查看指定历史版本信息

    kubectl rollout history deployment nginx-deployment --revision=1
    

    回滚到指定版本

    kubectl rollout undo deployment nginx-deployment --to-revision=1
    

    7.扩缩容

    kubectl scale deployment nginx-deployment --replicas=5
    kubectl scale deployment nginx-deployment --replicas=2
    

    k8s的附加组件

    4.1namespace命令空间

    namespace做资源隔离

    说明:根据业务名命令空间名,默认的事default。命令空间不同,资源名相同也不会冲突

    ubectl create namespace 空间名称
    

    4.2 健康检查

    4.2.1 探针的种类

    livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器

    readinessProbe:可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除

    4.2.2 探针的检测方法

    • exec:执行一段命令
    • httpGet:检测某个 http 请求的返回状态码
    • tcpSocket:测试某个端口是否能够连接

    4.2.3 liveness探针的exec使用

    vi  nginx_pod_exec.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: exec
    spec:
      containers:
        - name: nginx
          image: 10.0.0.11:5000/nginx:1.13
          ports:
            - containerPort: 80
          args:
            - /bin/sh
            - -c
            - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
          livenessProbe:
            exec:
              command:
                - cat
                - /tmp/healthy
            initialDelaySeconds: 5   
            periodSeconds: 5
    
    #创建pod
    [root@node1 ~]# kubectl create -f nginx-pod-exec.yaml
    #持续查看结果
    [root@node1 ~]# kubectl get pods exec
    NAME   READY   STATUS    RESTARTS   AGE
    exec   1/1     Running   1          74s
    

    4.2.4 liveness探针的httpGet使用

    vi   nginx_pod_httpGet.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: httpget
    spec:
      containers:
        - name: nginx
          image: 10.0.0.14/k8s/nginx:1.14
          ports:
            - containerPort: 80
          livenessProbe:
            httpGet:
              path: /index.html
              port: 80
            initialDelaySeconds: 3
            periodSeconds: 3
    

    创建pod

    [root@node1 ~]# kubectl create -f nginx_pod_httpGet.yaml
    pod/httpget created
    

    查看创建结果

    [root@node1 ~]# kubectl get pod httpget
    NAME      READY   STATUS    RESTARTS   AGE
    httpget   1/1     Running   0          52s
    

    进入pod 删除首页

    [root@node1 ~]# kubectl exec -it httpget /bin/bash
    root@httpget:/# cd usr/share/nginx/html/
    root@httpget:/usr/share/nginx/html# ls
    50x.html  index.html
    root@httpget:/usr/share/nginx/html# rm -rf index.html 
    root@httpget:/usr/share/nginx/html# exit
    

    测试结果(也可以通过查看创建pod过程)

    [root@node1 ~]# kubectl get pod httpget
    NAME      READY   STATUS    RESTARTS   AGE
    httpget   1/1     Running   1          3m5s
    

    4.2.5 liveness探针的tcpSocket使用

    vi   nginx_pod_tcpSocket.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: tcpSocket
    spec:
      containers:
        - name: nginx
          image: 10.0.0.14/k8s/nginx:1.14
          ports:
            - containerPort: 80
          livenessProbe:
            tcpSocket:
              port: 80
            initialDelaySeconds: 3
            periodSeconds: 3
    

    4.3.6 readiness探针的httpGet使用

    vi   nginx-rc-httpGet.yaml
    iapiVersion: v1
    kind: ReplicationController
    metadata:
      name: readiness
    spec:
      replicas: 2
      selector:
        app: readiness
      template:
        metadata:
          labels:
            app: readiness
        spec:
          containers:
          - name: readiness
            image: 10.0.0.14/k8s/nginx:1.14
            ports:
            - containerPort: 80
            readinessProbe:
              httpGet:
                path: /test.html
                port: 80
              initialDelaySeconds: 3
              periodSeconds: 3
    

    创建pod

    [root@node1 ~/health]# kubectl create -f nginx-rc-httpGet.yaml
    replicationcontroller/readiness created
    

    查看创建结果


    健康监测,创建test.html文件

    [root@node1 ~/health]# kubectl exec -it readiness-29f9d /bin/bahs
    OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"/bin/bahs\": stat /bin/bahs: no such file or directory": unknown
    command terminated with exit code 126
    [root@node1 ~/health]# kubectl exec -it readiness-29f9d /bin/bash
    root@readiness-29f9d:/# touch /usr/share/nginx/html/test.html
    root@readiness-29f9d:/# exit
    exit
    

    查看结果


    相关文章

      网友评论

          本文标题:k8s容器编排

          本文链接:https://www.haomeiwen.com/subject/ipxhrhtx.html