zoukankan      html  css  js  c++  java
  • CKA-Kubernets(K8s) (一)

    # 跨主机通讯网络

    BGP

    vxlan

    ...

    相关软件:calico flannel ...

    容器的编排工具

    compose,swarm,mesos(推特),kubernets,openshift(redhat)

    k8s 理解是一个壳,它并不直接管理容器,调用runtime--docker

    k8s  pod (又称为worker): 容器的包装(k8s最小单元)

    容器本身的功能比较单一,通过pod的各种策略,来管理容器

    # 对比虚拟化VC 环境框架

     # k8s 架构

    # k8s 架构

    master - 控制台

    kubectl

    REST API-server  : 接受用户各种请求

    scheduler :  调度器(选择创建pod创建位置)

    controiller-manager: 管家(检测k8s,运行情况)

    etcd: 数据库(所有操作存放的位置,不属于master下面的组件,可以独立安装单独服务器)

    svc--ip: 负载均衡器(外接用户发送请求到SVC,SVC转发到pod)

    kubeproxy:负债均衡器通过这个转发到后端pod

    kubelet:相当于代理(agent)维护和接受master指令

    CKA-Kubernets(K8s) 安装

    #  安装K8s环境--试验拓扑图

      

    OS:CentOS Linux release 7.7.1908 (Core)

    Master:192.168.24.216/22         vm1.loki.com vm1

    Worker1:192.168.27.217/22      vm2.loki.com vm2

    worker2:192.168.27.218/22       vm3.loki.com vm3

    前期准备工作

    setterm -blank 0  # 关闭字符界面屏保

    sudo yum install ntpdate -y;sudo ntpdate cn.pool.ntp.org   # 确保服务器时间正常,进行一次同步

    # 如果时区都不对,如下修改回来,确保时间正确

    sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    # 禁用swap

    swapoff -a

    为了防止开机启动那个,还需要注释掉 /etc/fstab里面的swap 或者命令删除swap这行内容

    如果不关闭swap,就会在kubeadm初始化Kubernetes的时候报错 

    设置成功后,Swap显示为0

    # 修改节点计算机名

     sudo hostnamectl set-hostname <短名字>

    # 修改防火墙策略(仅测试环境,实际工作环境根据自己情况)

    sudo firewall-cmd --set-default-zone=trusted

     # 检查selinux

      

    # host文件修改,并同步到其他节点  /etc/hosts

      

      # 配置yum源(视自己情况去阿里云或者网易源索取)

      

    # 安装docker-ce(所有节点)

    sudo yum install docker-ce -y

    # 所有节点都启动docker,并设置为开机启动

    sudo systemctl enable docker --now

    这里可以使用docker info 和docker version 查看启动后的docker版本及其他信息 

    # 修改内核参数(所有节点)

    sudo sh -c " cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    "

    # 让修改的文件生效(所有节点)

    sudo sysctl -p /etc/sysctl.d/k8s.conf 

      

    # 设置docker镜像加速器(所有节点,找自己的设置)

    sudo mkdir -p /etc/docker
    
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://1vs5nfat.mirror.aliyuncs.com"]
    }
    EOF
    
    sudo systemctl daemon-reload && sudo systemctl restart docker

    ## Kubernets 注意版本(所有节点安装)

     sudo yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0  --disableexcludes=kubernetes

     

      # --disable 的意思 去除其他源(多个源)相冲突的包

    # 启动服务并确认状态

    sudo systemctl start kubelet && sudo systemctl enable kubelet && sudo systemctl is-active kubelet

      

    # 源码包安装(自行研究)

     Master

    # Master节点操作 初始化集群(使用kubeadm 会生成很多容器,容器的镜像来自国外,所以需要指定yum源)

    sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.20.1 --pod-network-cidr=10.244.0.0/16

      

     --image-repository 指定使用的镜像源(国内原因)

    --pod-network-cidr=x.x.x.x/xx  指定一个内部的网段

    # 安装成功后提示如下:

     

     # 根据它的要求在当前master上执行:

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

    # 并提示如果有worker要加入你的集群,使用root身份执行下面的命令

     kubeadm join 192.168.27.216:6443 --token <token_value> --discovery-token-ca-cert-hash <sha256_value>

    可选参数:--ignore-preflight-errors=Swap

    kubeadm token

    如果忘记或者弄丢了join这串东西,可以使用kubeadm token 命令来创建和管理

     

    查看token是否还可用    sudo kubeadm token list

    #  还在则获取ca证书sha256编码hash值

    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

    # 创建token   kubeadm token create --print-join-command //默认有效期24小时,若想久一些可以结合--ttl参数,设为0则用不过期

    PS: 如果是非root用户执行,不加sudo会出现下面的错误

      

    # 使用sudo后命令正常

      

    # 删除某个token  sudo kubeadm token delete <TokenID>

        

    Worker 

    # 让所有worker 节点加入

    注:如果忘记关闭swapoff -a ,加入的时候就会有如下提示;(记得同步/etc/fstab一同注释掉)

    # 成功加入,如下提示

       

     # 验证(在master上操作)  kubectl get nodes

    kubectl get nodes -o wide  (查看更详细的节点信息,可以看到runtime)

      

     # 验证(在worker上操作) 如果在这个时候的worker节点上操作会得到如下提示:

    cause: 还没有配置k8s 的网络,从master节点也可以看到STATUS状态是NotReady

    开始配置网络

    # 配置网络有很多选择,我们这里使用的是 -- calico

    Github地址

      

    老师版本yaml:wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml

    我实验版本yaml:wget https://github.com/projectcalico/calico/blob/v3.16.9/manifests/calico.yaml

    # 导入镜像

    镜像地址 -- 3.16.9 

    导入github 下载下来的tar包镜像到每个节点的服务器

    # 老版本Calico 安装 v3.14  ====================

    sudo docker load -i calico_3_14.tar

      

    # 找到这个地方

    vim calico.yaml

     # 修改yaml文件参数

     # 让yaml文件配置生效

      

    # 验证

    # 新版本calico 安装v3.16.9  ====================

    release-v3.16.9.tgz   下载安装包后解压

    进入 /home/loki/Tools/calico/release-v3.16.9/k8s-manifests

    kubectl create -f ./tigera-operator.yaml

    修改配置文件(这里的pod 地址改为你master初始化时候用的地址)

    /home/loki/Tools/calico/release-v3.16.9/k8s-manifests/custom-resources.yaml

    改完配置文件后,执行 kubectl create -f ./custom-resources.yaml 

    # 使用这个命令来观察和等待每个calico网络Pod的STATUS变成Running进度

    watch kubectl get pods -n calico-system

     

     # 如果遇到Terminationg(终结,解雇) 状态的pod,想要强制删除

    kubectl delete pod calico-kube-controllers-8b49479fc-nllkd -n calico-system --force --grace-period=0

        :NAMESPACE

        :NAME

    # kubectl 补全小功能设置

    # 确认有这个包,如果没有通过 yum install -y bash-completion 安装

      

    原理:kubectl completion bash 命令

    vim /etc/profile

    source /etc/profile

     # 去除一个节点  kubectl drain <节点名> --ignore-daemonsets --force

       

    # 删除一个节点  kubectl delete nodes <节点名>

     

      

    # 去节点上清除配置  sudo kubeadm reset 

     # 如果重置配置提示错误,清除一下证书

      

      

    注意: 如果master 重置后,一定需要重新配置网络

     

    # 集群常见命令

    kubectl cluster-info

      

     kuberctl version

     

     

      

    kubeadm config view  查看验证文件的结构

     PS:上面提示未来的k8s版本将会移除这个命令你,官方推荐使用

    kubectl get cm -o yaml -n kube-system kubeadm-config 

    apiVersion: v1
    data:
      ClusterConfiguration: |
        apiServer:
          extraArgs:
            authorization-mode: Node,RBAC
          timeoutForControlPlane: 4m0s
        apiVersion: kubeadm.k8s.io/v1beta2
        certificatesDir: /etc/kubernetes/pki
        clusterName: kubernetes
        controllerManager: {}
        dns:
          type: CoreDNS
        etcd:
          local:
            dataDir: /var/lib/etcd
        imageRepository: registry.aliyuncs.com/google_containers
        kind: ClusterConfiguration
        kubernetesVersion: v1.20.1
        networking:
          dnsDomain: cluster.local
          podSubnet: 10.244.0.0/16
          serviceSubnet: 10.96.0.0/12
        scheduler: {}
      ClusterStatus: |
        apiEndpoints:
          vm1:
            advertiseAddress: 192.168.27.216
            bindPort: 6443
        apiVersion: kubeadm.k8s.io/v1beta2
        kind: ClusterStatus
    kind: ConfigMap
    metadata:
      creationTimestamp: "2021-03-08T03:38:29Z"
      managedFields:
      - apiVersion: v1
        fieldsType: FieldsV1
        fieldsV1:
          f:data:
            .: {}
            f:ClusterConfiguration: {}
            f:ClusterStatus: {}
        manager: kubeadm
        operation: Update
        time: "2021-03-08T03:38:29Z"
      name: kubeadm-config
      namespace: kube-system
      resourceVersion: "222"
      uid: b58d22d3-8ce2-4eb5-9701-3f82b8ba7cc5
    View Code

     # 保存集群配置

     

     kubectl get cm -o yaml -n kube-system kubeadm-config  > configview_new.yaml 

    # 使用_new.yaml文件进行初始化还原的时候,遇到报错(待研究???

     # 重新初始化的时候,就可以使用上次保存的yaml文件

      

    kubectl get pods

    kubectl top nodes

    kubectl top pods

    Metrics

    # 设置metric server   一种监控

    # v0.36版本

    https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml

    wget https://github.com/kubernetes-sigs/metrics-server/archive/v0.3.6.tar.gz -O metrics-server-v0.3.6.tar.gz

    # v0.42版本

    wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.2/components.yaml

    wget https://github.com/kubernetes-sigs/metrics-server/archive/v0.4.2.tar.gz -O metrics-server-v0.4.2.tar.gz

     # 所有需要监控的节点都要导入这个镜像包

    docker -i metrics-img.tar

    # 修改metrics-server-0.3.6版本中的 metrics-server-deployment.yaml 文件

    /home/loki/Tools/metrics-server/metrics-server-0.3.6/deploy/1.8+/metrics-server-deployment.yaml

    # 添加和修改下面的参数

     注意:保持yaml文件的对齐关系

      

    #  查看部署结果

    kubectl -n kube-system get pods -l k8s-app=metrics-server

    kubectl top nodes

     

     kubectl top pods -n kube-system  # 查看名称空间kube-system 下的pods资源使用情况

     

     注: 物理CPU一个核心 分城1024份, 每一份叫做一个 微核心  m

    # 如果出现下面的显示,可能会出现下面的问题

    了解namespace

    作用: 不同的应用不同的程序空间用来做分类隔离

    # 查看指定命名空间   kubectl get pods -n <空间名>

    #查看指定命名空间(ns是简写) kubectl get ns

      

     # 创建命名空间   kubectl create ns <空间名>

      

    # 切换当前所在的命名空间   kubectl config set-context --current --namespace=<名称空间>

      

    # Kubenes  工具(命名空间简化操作工具) 适合生产环境方便和简化切换

    多集群切换

    简单粗暴修改config文件版本

    集群蓝绿部署;同时管理多个集群,并且无缝切换

     文件位置:  ~/.kube/config

    # 删除了密钥后的简略内容如下

       

    # 查看当前集群数量   kubectl config get-contexts

       

    clusters: 集群

      

    contexts: 集群上下文(命名空间,用户名...)

    users: 用户信息

    # 最后复制2个集群的证书Token值到模板

    PS:注意复制的时候字段:前留1个空格问题

     # 不然就会出现下面报错,提示值有问题   kubectl config get-contexts

      

    # 查看当前上下文  kubectl config get-contexts 

    # 切换上下文  kubectl config use-context  <NAME>

      

    etcd流程

     

    不属于Kubernets组件,但是又是Kubernets必须的一个组件

    # etcd可以单独拿出来做为一个服务器

    etcd集群

    Leader      (主节点,选举)

    Follower  (读)

    Candidate  重新选举前(如果有Leader挂掉,重新投票选举)

    # 搭建etcd集群的时候,尽可能的使用奇数个节点 

    etcd有两个版本(两个版本管理数据方式不一样)

    v2  

    v3: 都是以键值对的方式   aa=bb key=value

    开启方式  

     

    实验:单独一台机器来做etcd集群实验

    1. 了解单节点集群

    yum install etcd -y

    etcd相互通讯 2380端口

    客户端连接etcd 2379端口

    修改etcd.conf 配置文件    /etc/etcd/etcd.conf

      修改完毕后重启服务 sudo systemctl restart etcd

    # 查看我们在哪个节点  etcdctl member list

      

    # 查看etcd节点 状态  etcdctl cluster-health

      

    # 数据存储在(配置文件里面指定的路径) 

      

    # 验证,可以使用etcdctl + 常用指令参考下文

    NAME:
       etcdctl - A simple command line client for etcd.
    
    WARNING:
       Environment variable ETCDCTL_API is not set; defaults to etcdctl v2.
       Set environment variable ETCDCTL_API=3 to use v3 API or ETCDCTL_API=2 to use v2 API.
    
    USAGE:
       etcdctl [global options] command [command options] [arguments...]
       
    VERSION:
       3.3.11
       
    COMMANDS:
         backup          backup an etcd directory
         cluster-health  check the health of the etcd cluster
         mk              make a new key with a given value
         mkdir           make a new directory
         rm              remove a key or a directory
         rmdir           removes the key if it is an empty directory or a key-value pair
         get             retrieve the value of a key
         ls              retrieve a directory
         set             set the value of a key
         setdir          create a new directory or update an existing directory TTL
         update          update an existing key with a given value
         updatedir       update an existing directory
         watch           watch a key for changes
         exec-watch      watch a key for changes and exec an executable
         member          member add, remove and list subcommands
         user            user add, grant and revoke subcommands
         role            role add, grant and revoke subcommands
         auth            overall auth controls
         help, h         Shows a list of commands or help for one command
    View Code

       

    2. 多节点集群

     /etc/etcd/etcd.conf  # 多个配置文件复制到不同节点

    ETCD_INITIAL_CLUSTER_TOKEN= Token 多个节点的值要保持一样

    new 初始化集群

    # 其他节点上要修改下配置文件IP

    修改完毕后,再次重启服务 sudo systemctl restart etcd

     # 注意如果有一个节点刚加入的时候配置文件错误,出现类似单机的结果:

     

     

    排查思路:

    1. 仔细检查配置文件是否正确,尤其是3个节点的名字是否都填写

    2. 如果是"new"需要所有节点都清除数据库(rm -rf /var/lib/etcd/default.etcd/)或者用"existing"参数进行加入集群

    # 验证,测试数据同步  etcdctl member list 

      

    # etcd集群健康检查  etcdctl cluster-health  

     etcdctl ls /

    etcdctl mkdir /目录名

    # V3 验证方式

    切换v3  export ETCDCTL_API=3,切换成功后etcdctl --help 命令会变多

    [loki@vm2 ~]$ etcdctl --help
    NAME:
        etcdctl - A simple command line client for etcd3.
    
    USAGE:
        etcdctl
    
    VERSION:
        3.3.11
    
    API VERSION:
        3.3
    
    
    COMMANDS:
        get            Gets the key or a range of keys
        put            Puts the given key into the store
        del            Removes the specified key or range of keys [key, range_end)
        txn            Txn processes all the requests in one transaction
        compaction        Compacts the event history in etcd
        alarm disarm        Disarms all alarms
        alarm list        Lists all alarms
        defrag            Defragments the storage of the etcd members with given endpoints
        endpoint health        Checks the healthiness of endpoints specified in `--endpoints` flag
        endpoint status        Prints out the status of endpoints specified in `--endpoints` flag
        endpoint hashkv        Prints the KV history hash for each endpoint in --endpoints
        move-leader        Transfers leadership to another etcd cluster member.
        watch            Watches events stream on keys or prefixes
        version            Prints the version of etcdctl
        lease grant        Creates leases
        lease revoke        Revokes leases
        lease timetolive    Get lease information
        lease list        List all active leases
        lease keep-alive    Keeps leases alive (renew)
        member add        Adds a member into the cluster
        member remove        Removes a member from the cluster
        member update        Updates a member in the cluster
        member list        Lists all members in the cluster
        snapshot save        Stores an etcd node backend snapshot to a given file
        snapshot restore    Restores an etcd member snapshot to an etcd directory
        snapshot status        Gets backend snapshot status of a given file
        make-mirror        Makes a mirror at the destination etcd cluster
        migrate            Migrates keys in a v2 store to a mvcc store
        lock            Acquires a named lock
        elect            Observes and participates in leader election
        auth enable        Enables authentication
        auth disable        Disables authentication
        user add        Adds a new user
        user delete        Deletes a user
        user get        Gets detailed information of a user
        user list        Lists all users
        user passwd        Changes password of user
        user grant-role        Grants a role to a user
        user revoke-role    Revokes a role from a user
        role add        Adds a new role
        role delete        Deletes a role
        role get        Gets detailed information of a role
        role list        Lists all roles
        role grant-permission    Grants a key to a role
        role revoke-permission    Revokes a key from a role
        check perf        Check the performance of the etcd cluster
        help            Help about any command
    
    OPTIONS:
          --cacert=""                verify certificates of TLS-enabled secure servers using this CA bundle
          --cert=""                    identify secure client using this TLS certificate file
          --command-timeout=5s            timeout for short running command (excluding dial timeout)
          --debug[=false]                enable client-side debug logging
          --dial-timeout=2s                dial timeout for client connections
      -d, --discovery-srv=""            domain name to query for SRV records describing cluster endpoints
          --endpoints=[127.0.0.1:2379]        gRPC endpoints
          --hex[=false]                print byte strings as hex encoded strings
          --insecure-discovery[=true]        accept insecure SRV records describing cluster endpoints
          --insecure-skip-tls-verify[=false]    skip server certificate verification
          --insecure-transport[=true]        disable transport security for client connections
          --keepalive-time=2s            keepalive time for client connections
          --keepalive-timeout=6s            keepalive timeout for client connections
          --key=""                    identify secure client using this TLS key file
          --user=""                    username[:password] for authentication (prompt if password is not supplied)
      -w, --write-out="simple"            set the output format (fields, json, protobuf, simple, table)
    View Code

      

    如何对etcd的数据进行备份(etcd v3 版本 快照实验)

    # 做快照的话只能在3版本里来做

     # 因为测试环境没有证书,所以直接这样进行快照

       

    如何对etcd的数据进行恢复快照

    # 在每个节点上停止etcd,并且快照文件snap1.db复制到每个节点上

    sudo systemctl stop etcd    # 停止每个节点的etcd服务

    sudo rm -rf /var/lib/etcd/*    # 清除每个节点的数据库目录

    # 最好切换root身份执行,下面命令,切换root后需要再次执行一次切换v3版本命令

    PS: 不切换root身份,创建etcd数据库文件夹的时候会提示权限不足

     export ETCDCTL_API=3

     etcdctl snapshot restore snap1.db --name etcd-217 --initial-cluster etcd-217=http://192.168.27.217:2380,etcd-218=http://192.168.27.218:2380,etcd-219=http://192.168.27.219:2380 --initial-advertise-peer-urls http://192.168.27.217:2380 --data-dir /var/lib/etcd/default.etcd
    # 注意标黄部分需要,视不同节点修改对应值

    执行上面命令后修改一下权限 chown -R etcd.etcd /var/lib/etcd

    执行启动 systemctl start etcd   # 查询之前删除的数据是否恢复

    PS:注意恢复的数据也仅仅是v3版本的

    如何往集群里添加及删除

    # 加入集群要使用版本2的方式

      

     复制服务器上的配置文件文本 /etc/etcd/etc.conf 到新的etcd节点,修改配置文件

    修改"new"为"existing"

    添加新节点IP端口名,还有新节点名字

      

     # 最后,到其他节点上面执行下面的命令,告知其他节点有新节点加入集群

    export ETCDCTL_API=2

    etcdctl member add etcd-219 http://192.168.27.219:2380   # 只需要在集群里面其中一台执行

     

     最后,在回到新节点上面启动和验证 systemctl start etcd

      

    # 删除节点

    etcdctl member remove <节点名> 

    4. 在k8s你是如何连接到etcd

    # 单机k8s etc配置文件存放位置(pod)

      

    CKA-2 pod

    # 开始试验环境准备

     创建一个叫2-pod命名空间

     kubectl create ns 2-pod 

     

    # 创建pod    kubectl run <PodName> --image=<镜像名> --image-pull-policy=IfNotPresent

     # 因为busybox是没有守护进程的一个镜像,所以这里用到了-i -t参数

      

    查看创建的pods   kubectl get pods    kubectl get pods -o wide

       

    # 查看标签  kubectl get pods --show-labels

      

     # 设置标签  kubectl label pod <PodName> <Key=Values>

      

    # 查看指定标签名的pod  kubectl get pods -l <Key=Values>

      

     # 取消标签  kubectl label pod <PodName> <labelsName->  # 注意是一个"-"

      

    # --image-pull-policy=<Values>  三个参数介绍

     Always 每次都下载最新镜像 (默认值)

    Never 只使用本地镜像

    ifNotPresent 本地没有才下载

    # 实时监控pod 状态  -w    kubectl get pods -w

      

    # 删除pod --force  会比较快速删除pod

    Yaml 文件介绍 

    # yaml文件方式创建

     --dry-run=client # 模拟去创建,测试语法 

    yaml语法简介默认 --> 2个空格

    字典: 某个字典里的变量不能有重复,后面的变量会覆盖前面的变量

    列表:每个都是一个单独的元素,元素里面都是变量

    列表和字典的区别是在yaml里面列表你每一个对象会有一个“-”

     

      

    kubectl explain pod  # 查看第1级有哪些选项可以用. 

    KIND:     Pod
    VERSION:  v1
    
    DESCRIPTION:
         Pod is a collection of containers that can run on a host. This resource is
         created by clients and scheduled onto hosts.
    
    FIELDS:
       apiVersion    <string>
         APIVersion defines the versioned schema of this representation of an
         object. Servers should convert recognized schemas to the latest internal
         value, and may reject unrecognized values. More info:
         https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
    
       kind    <string>
         Kind is a string value representing the REST resource this object
         represents. Servers may infer this from the endpoint the client submits
         requests to. Cannot be updated. In CamelCase. More info:
         https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
    
       metadata    <Object>
         Standard object's metadata. More info:
         https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
    
       spec    <Object>
         Specification of the desired behavior of the pod. More info:
         https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
    
       status    <Object>
         Most recently observed status of the pod. This data may not be up to date.
         Populated by the system. Read-only. More info:
         https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
    View Code

    kubectl explain pod.metadata  # 查看第2级有哪些选项可以用

    kubectl explain pod.spec.containers   # 以此类推

    # 让yaml文件生效  kubectl apply -f <YAML文件>

      

     # 删除yaml创建的pod    kubectl delete -f <YAML文件>   kubect delete -f <YAML文件>  --force

      

    利用YAML模板的优势可以方便的替换pod模板

    sed 's/pod3/pod4/' pod3.yaml       # 可以看到你利用模板创建pod4的主机

    如果想要临时替换一些值,并应用可以:

    sed 's/pod3/pod4/' pod3.yaml | kubectl apply -f -

     # 最后的 "-" 让前面输出的结果生效并应用到k8s(快速相同模板,创建不同pod)

       

    pod和容器使用相同的共享网络空间

    # 查看pod 里面的详细信息   kubectl describe pod <PodName>

      

     # 进入pod 里面  kubectl  exec <PodName> -- <Command>

    # 获取shell   kubect exec -it <PodName> -- <bash Or sh>

     

      

     主:如果pod下面有多个容器   "-c" 容器名

    # 查看容器里面的logs信息  kubect logs <Podname> -c <子容器名> 

     # cp 操作  kubectl cp <源地址> <PodName>:<目标地址>  -c <子容器名> 

     

     # 查看某个pod的yaml文件  kubectl get pods pod1 -o yaml > pod1.yaml

     

      

    pod 运行的生命周期 

    restartPolicy:                    # 重启策略

    Always      总是重启

    Never        永不重启

    OnFailure  非正常结束才重启

      

    3种写的方式(需练习)

    # 1. 手动修改切记注意缩进

    # 2. 参数上面字典和列表要注意区分,划线这部分开始第一位需要加"-"

    第一种

      第二种

     第三种(使用命令导出模板的默认值)

    kubectl run pod7 --image=busybox --dry-run=client -o yaml -- sh -c sleep 60 > pod7.yaml

      

    默认是30s的宽限期 ,如果30秒还没有结束,将会被强制删除。这种删除pod的方式叫做 优雅的关闭pod

    # 如何修改这个宽限时间,通过explanin命令查看命令提示

     

      

      

    postStart:  容器启动的时候会同步运行这个

    preStop:  容器关闭的时候会同步关闭这个

    yaml文件--变量的值只能是字符串,不能写纯数字

     

    初始化容器  

    # 作用:提前做一些准备工作

    alpine

    # 容器为了安全,默认不允许容器修改内核参数

     # 注意command 命令行[]里面的参数不能有空格

     # 初始化容器,先准备一些数据,例子:

    静态Pod   static pod

    不受master的管理,完全由节点kubelet来管理

    写好一个yaml文件,放在特定的目录里,kubelet会自动应用这个yaml文件

    systemctl  status kubelet 

    # 这里是在非master节点上操作的(work节点上做)

     --pod-manifest-path=/etc/kubernetes/xx

    Master 节点

      

      

    # 此静态pod的作用是什么

    使用场景比较单一,一般用于维护提示(或者master节点没有启动想要启动的pod,直接放到系统默认指定的特定目录)

      

    pod调度

    # 查看节点详情

    kubectl describe nodes <节点名>

      

     # 手动指定调度pod的创建位置

     

    1. 指定pod运行在某个节点上,修改yaml文件的方式

      

    2.  通过标签的方式

    # 查看标签

    # 标签的格式,kv键值对

     

     # 去除键值,用"-"  

    kubectl label nodes vm1 node-role.kubernetes.io/control-plane-

    kubectl label nodes vm1 node-role.kubernetes.io/master-

       

     # 设定节点的Roles名  kubectl label nodes <WorkNode> node-role.kubernetes.io/<想要设置的名字>=

       

     # 设置所有节点标签  kubectl label nodes --all <Key=Values>

       

    # 取消设置的  kubectl label nodes --all Key-

     

        

    # 显示指定标签的节点  kubectl get node -l <Key=Values>

       

    Pending(挂起)   # 指定的创建节点并不存在,会出现Pending状态

      

    # 标签覆盖(如果已经设置了标签,再次设置标签)  --overwrite

        

    主机亲和性

    # 硬策略;如果没有满足条件出现“Peding”

    # 软策略;优先在满足策略的条件下运行,如果不满足去其他节点运行

          containers:
          - image: nginx
            imagePullPolicy: IfNotPresent
            name: nginx
            resources: {}
          affinity:
            nodeAffinity:
             # requiredDuringSchedulingIgnoredDuringExecution:  # 硬策略
             #   nodeSelectorTerms:
             #   - matchExpressions:
             #     - key: kubernetes.io/hostname
             #       operator: In
             #       values:
             #       - vms63.rhce.cc
             #       - vms62.rhce.cc
              preferredDuringSchedulingIgnoredDuringExecution:  # 软策略
              - weight: 2  # 多个条件就要比较权重
                preference:
                  matchExpressions:
                  - key: bb
                    operator: Gt
                    values:
                    - "3"

    警戒线  cordon

    # 临时创建5个副本

    # 副本数临时增长10个

      

    # 取消维护模式(指定某个节点进入维护模式,不在接受新的pod到此节点)

     

      

    调度:节点的drain(驱逐)

    类似cordon,但是会把已经在节点上面pod驱逐到其他容器上面。

    注: drain(驱逐),就是把本地存在的pod删除。

         到底能否在其他节点上创建新的pod,取决于这个pod是否通过控制器来控制的

         单独创建出来的pod,就不会再运行了

     # 如果上面有手动创建的pod,提示如下

        

     # 取消和cordon一样 是用 uncordon

    # 查看污点

     

      # 查看指定标签

      

    设置污点和容忍污点

    # 给指定节点设置污点  kubectl taint node vm2 <Label_Key:Label_Value>:NoSchedule

      

      

    # 取消污点   kubectl taint node <Node_Name> <Label_name>-

     Tips: 如果想在master上单机运行k8s的pod,就需要取消污点

  • 相关阅读:
    剑指offer-树的子结构
    剑指offer-二叉搜索树的后序遍历序列
    剑指offer-调整数组顺序使奇数位于偶数前面
    剑指offer-包含min函数的栈
    剑指offer-从上往下打印二叉树
    剑指offer-链表中倒数第k个结点
    剑指offer-合并两个排列的链接
    剑指offer-替换空格
    剑指offer-旋转数组的最小数字
    剑指offer-数字在排序数组中出现的次数
  • 原文地址:https://www.cnblogs.com/Cong0ks/p/14459881.html
Copyright © 2011-2022 走看看