K8S 搭建

K8S 搭建




kubernetes    k8s    ...未完成待续



Kubectl 命令自动补全
    # yum install bash-completion
    # echo 'source /usr/share/bash-completion/bash_completion' >> /etc/profile
    # echo 'source <(kubectl completion bash)' >> /etc/profile
    # source /etc/profile


https://github.com/kubernetes/kubernetes





https://github.com/kubernetes/kubernetes/releases  --> Additional binary downloads are linked in the CHANGELOG. --> Downloads for v1.20.2


Server binaries



master  node 都是用的 server端




kubernetes 安装


# cd /etc/yum.repos.d
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo             \\ 可地址来源 见备注


# cat <<EOF > /etc/yum.repos.d/kubernetes.repo                                          \\ 阿里云的 yum 源
[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




# yum install docker-ce kubelet kubeadm kubectl
# systemctl daemon-reload
# systemctl enable docker
# systemctl restart docker
# cat /proc/sys/net/bridge/bridge-nf-call-iptables             \\ 确保此值为 1
# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables             \\ 确保此值为 1

# rpm -ql kubelet                              \\ 安装生成的文件
    /etc/kubernetes/manifests                   \\ 清单目录
    /etc/sysconfig/kubelet                       \\ 主配置文件
    /usr/bin/kubelet                              \\ 主程序
    /usr/lib/systemd/system/kubelet.service
# systemctl start kubelet
# systemctl status kubelet             \\ 未启动成功
# tail /var/log/messages                \\ 查看 日志
# systemctl stop kubelet
# systemctl enable kubelet

# kubeadm init --help                    \\ 初始化 帮助

# vim /etc/sysconfig/kubelet
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"          \\ k8s默认不允许使用交换分区 如有交换分区可加此选项 不让报错




# kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors Swap
    kubeadm join 172.21.34.201:6443 --token g2mbcl.tluo55j437cbd4xp \
        --discovery-token-ca-cert-hash sha256:4ecb8cb6432a900c33e0a5a6a834c54dab34ec8d9bf6051cc86192644f10ee1d

# docker image ls         \\ 会有7个镜像
# ss -tnl                  \\ 6443
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# kubectl get -h               \\ 查询命令  get 帮助命令
# vim /etc/kubernetes/manifests/kube-scheduler.yaml
    #    - --port=0              \\ 注释掉这行
# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
    #    - --port=0                \\ 注释掉这行
# kubectl get cs                    \\ 组件状态信息 如不注释掉上面 port=0 会报错

# kubectl get nodes                   \\ 查看 所有节点

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml  \\ flannel 部署
# docker image ls                      \\ 有 flannel 镜像
# kubectl get ns                        \\ 查看系统的 名称空间
# kubectl get pods -n kube-system        \\ flannel 正常运行 -n指定名称空间  没有-n是默认名称空间
    kube-flannel-ds-cnflp                           1/1     Running   0          13m


节点

    # hostnamectl set-hostname node01
    # vim /etc/hosts
        172.21.34.202 node01
    # scp 172.21.34.201:/etc/yum.repos.d/docker-ce.repo /etc/yum.repos.d/
    # scp 172.21.34.201:/etc/yum.repos.d/kubernetes.repo /etc/yum.repos.d/             \\ 复制到其他的两个节点
    # yum install docker-ce kubelet kubeadm kubectl

    # scp 172.21.34.201:/usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service    \\ 拉取 启动文件到节点
    # scp 172.21.34.201:/etc/sysconfig/kubelet /etc/sysconfig/kubelet                                     \\ 拉取 配置文件到节点

    # systemctl enable docker kubelet
    # systemctl start docker
    # kubeadm join 172.21.34.201:6443 --token gy0741.18zxk1skak3x6kop --discovery-token-ca-cert-hash sha256:4ecb8cb6432a900c33e0a5a6a834c54dab34ec8d9bf6051cc86192644f10ee1d --ignore-preflight-errors=Swap
    # docker image ls                     \\ 会有3个镜像


# kubectl get nodes                          \\ 有显示 node01节点 说明节点已经启动成功
# kubectl get pods -n kube-system -o wide





注: 
    阿里云 docker-ce 镜像地址:  https://mirrors.aliyun.com/docker-ce/  -->  linux --> centos --> docker-ce.repo

    https://mirrors.aliyun.com/kubernetes/ --> yum --> repos --> kubernetes-el7-x86_64 --> 

    flannel 网址: https://github.com/coreos/flannel

    如果提示 error execution phase preflight ... ... 错误  可能使 token 过期 或者不对 可以到 master上重新生成
        # kubeadm token create
            424mp7.nkxx07p940mkl2nd
        # openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
            d88fb55cb1bd659023b11e61052b39bbfe99842b0636574a16c76df186fd5e0d








# kubectl run n1 --image=nginx --port=80
# kubectl get pods -o wide                   \\ -o wide 显示更多的信息   可以看到在node01上面运行的nginx 
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    n1     1/1     Running   0          29m   10.244.1.2   node01   <none>           <none>
# curl 10.244.1.2                              \\ master及节点中的机器都可以访问





.......................................................................................................................

待整理  014 kubernetes应用快速入门-QwQbP9FaLbI.mp4


# kubectl cluster-info          \\ 查看整个 k8s 集群的信息



# kubectl create deployment n1 --image=nginx   \\ 使用 deployment 创建名字为 n1的 pods 镜像是 nginx
# kubectl get deployment                        \\ 查看 deployment
# kubectl get pods -o wide                       \\ 查看 pods
    NAME                  READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
    n1-5669f9c9d7-2wc9g   1/1     Running   0          3m43s   10.244.2.3   node02   <none>           <none>

# kubectl delete pod n1-5669f9c9d7-2wc9g           \\ 删除 n1-5669f9c9d7-2wc9g 这个 pods
# kubectl get pod -o wide                           \\ 会看到 自动重新创建了 pods   名字及ip都会改变
    NAME                  READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    n1-5669f9c9d7-g55cb   1/1     Running   0          83s   10.244.1.4   node01   <none>           <none>


# kubectl expose               \\ 暴露


通过标签 和标签选择器 来创建 不是基于地址来创建的


# kubectl run n2 --image=nginx --port=80 --replicas=1 --dry-run=true




# kubectl expose deployment n1 --name=nginx1 --port=80 --target-port=80 --protocol=TCP

# kubectl get svc       \\ 查看服务  全称为 kubectl get services


# kubectl get pods -n kube-system -o wide    \\ 显示 DNS 

# kubectl get svc -n kube-system              \\ 可以看到DNS服务器为10.96.0.10
    kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   6h5m



# kubectl run b1 --image=busybox --replicas=1 -it --restart=Never      \\ 创建个 客户端 pod b1基于镜像busybox   --restart=Never 如果pod b1 关掉了不自动重新创建
    cat /etc/resolv.conf          \\ DNS服务器是 10.96.0.10
        nameserver 10.96.0.10









# kubectl get pods --show-labels       \\ 显示pod是时候 显示标签




# kubectl edit svc nginx1           \\ 编辑服务器 nginx1
 


# kubectl delete svc nginx1      \\ 删除服务器 nginx1
# kubectl get svc                 \\ nginx1 已经删除



# kubectl describe deployment n1


# kubectl get deployment -w     \\ 不会退出 监控状态


# kubectl scale --replicas=5 deployment myapp

..........................................................................................................................

资源 对象

workload工作负载型资源: pod   replicaset   deployment  statefulset daemonset  cronjob 
服务发现及均衡   service  ingress
配置与存储       volume csi   
    configmap secret
    downwardapi
集群级资源 

- "echo $(date) >> /usr/share/nginx/html/index.html; sleep 5"   \\ 运行的命令


大部分资源的配置清单




使用yaml清单 创建pods 一个 pods 中 创建 两个容器

    # kubectl explain pods        \\ 显示pods版本
        KIND:     Pod
        VERSION:  v1
    # vim pod-demol.yaml             \\ 注意 大小写
        apiVersion: v1                \\ 版本
        kind: Pod                      \\ 类型
        metadata:                       \\ 定义元数据
          name: p1                       \\ 名字
          namespace: default              \\ 名称空间 默认
          labels:                          \\ 标签    类型是<map[string]string> 是映射
            app: mynginx                    \\ 随便写
            tier: frontend                   \\ 所属的层次 前端    随便写
        #  labels: {app:myapp, tier:frontend  \\ 所有的映射的数据都可以使用 花括号给出来 例如此
        spec:                            \\ 规格
          containers:                     \\ 容器 类型为<[]Object>
          - name: nginx1                   \\ 容器名  对象列表<[]Object> 使用 - 横线来引导 此为第一个容器
            image: nginx:latest             \\ 镜像
          - name: busybox1                   \\ 此为第二个容器   一个pods里面可以 有多个容器   辅助主容器工作
            image: busybox:latest
            command:                           \\ 额外修改第二个容器的 运行的命令  是个  对象列表<[]Object> 类型
            - "/bin/sh"                         \\ 
            - "-c"                               \\ 传递的第一个参数 -c
            - "sleep 3600"                        \\ 运行的命令
        #    command: ["/bin/sh","-c","sleep 3600"]          \\ 所有的列表 都可以使用 中括号给出来 例如此
                   
    # kubectl create -f p1.yaml         \\ 基于 yaml配置文件 创建 pods
        NAME       READY      STATUS      RESTARTS      AGE
        p1          2/2       Running        1          18s            \\ 2/2 为2个容器
    # kubectl get pods                     \\ 查看 pods
    # kubectl describe pods p1              \\ 显示 pods 的详细信息 会有ip等信息
    # curl 10.244.2.5
    # kubectl logs pod-demo nginx1            \\ 可查看nginx 日志
    # kubectl logs pod-demo busybox1           \\ 可看到 busybox1 日志
    # kubectl exec -it p1 -c nginx1 -- /bin/sh  \\ 可以连接 进去 nginx  p1为pods名  -- 与docker不一样 需要使用此符号 -c指明容器名
    # kubectl delete pods p1                     \\ 删除 pods  p1
    # kubectl create -f p1.yaml
    # kubectl get pods -w

    # kubectl delete -f p1.yaml                 \\ 亦可以 使用此 删除 p1.yaml 清单所创建的pods 此文件并不会删除 亦可在创建





注: 
    1. 关于 pods 的 yaml格式
        version: 版本
            group/version , 由 group和version组成 如果没有group 默认为core之意 为核心组 最根本的资源

            # kubectl api-versions      \\ 显示api 所支持的版本
                autoscaling/v1           \\ 稳定版 以后不会改变
                autoscaling/v2beta1       \\ beta 公测版本   以后可能会改变
                autoscaling/v2beta2

        kind:   资源类别
            pod

        metadata:  元数据
            name 名字
            namespace 名称空间
            labels 标签
            annotations 资源注解
            ownerReferences
            resourceVersion 
            uid                   唯一表示 系统自动生成
            selfLink 自引用

        spec: 规格 定义应该有什么样的特性  应该满足什么样的规范 由用户定义
            containers: 关于容器
                image: 镜像信息
        status: 显示当前资源的 当前状态    k8s会 把当前状态向目标状态 无限接近或转移 来能够满足用户需要  此项目 只读 

    2. 关于 pods 的定义格式

        # kubectl explain pods                \\ pods 资源 怎么定义
        # kubectl explain pods.metadata        \\ pods 中的 metadata 怎么定义
        # kubectl explain pods.spec
        # kubectl explain pods.spec.containers
        # kubectl explain pods.spec.containers.livenessProbe
            <Object>                  对象     需要嵌套很多二级字段的
            <[]Object>                对象列表     对象类型的数组
            <string>                  字符串
            <[]string>                字符串列表   字符串类型的数组
            <map[string]string>       映射 由键值组成的映射  另外一个jison 数组
                -required-            必选

        # kubectl get pods           \\ 查看pods
        # kubectl get pod n1-5669f9c9d7-g55cb -o yaml  \\ 查看pod n1的  yaml 








yaml清单 各个参数详解

apiVersion: v1
kind: Pod             # 类型为 Pod
metadata:              # 元数据
  name: p1              # 此为 pods 的名字
  namespace: default     # 名称空间 为 默认
  labels:                 # 标签
    # 标签1: 内容1          # 标签1 随便起 由字母 数字 _ - . 组成  只能字母或数字开头及结尾 中间可使用 下划线 杠杠 点
    app: mynginx            # 内容1 随便起 同上 但是可以为空
    tier: frontend
  annotations:          # 类似标签的功能 当不能 用于 标签选择   主要用于属性 注解等 
    nginx1: teo1         # 标注镜像的作者是teo1 而已
spec:                     # 规格 详解
  containers:              # <[]object>  关于容器的指令
  - name: nginx1            # <string>  此为 容器的名字
    image: nginx:latest      # <string> 此为 镜像的名字
    imagePullPolicy IfNotPresent   # <string>  下面为三个参数 此项创建后不允许更改 只能在创建前指定
                      # Alway 本地无论有没有 都去仓库下载   ... 如果标签为latest 则此项为默认值
                       # Never 本地有就用 没有也不去下载
                        # IfNotPresent 本地存在直接使用 本地没有才去仓库下载  ... 如果不是标签为latest的 此项为默认值
    ports:                    # 暴露端口 并不能真正意义上起到暴露端口的作用  真正暴露需要在server上定义
    - name: http               # 名字 随便起
      containerPore: 80         # 暴露 80     没指定协议 默认为 TCP协议
    - name: https
      containerPore: 443          # 暴露 443
    command: ["/bin/sh","-c","touch /tmp/healthy;sleep 30; rm -f /tmp/healthy; sleep 3600"]
                 # 第一种定义command的方式 如果没有提供command 会运行镜像中默认命令   ... 类似 dockerfile 中的entrypoint
    args:        # 这里的$() 为变量引用 相当于 shell中的 ${}   只当做参数来使用
                 # 1. 如果未定义 command 和args 则运行容器中的 entrypoint 和 cmd
                 # 2. 如果只定义了command 只运行 command ... 会忽略 entrypoint 和 cmd
                 # 3. 如果只定义了 args 则 使用entrypoint 当命令 args 当参数 ... 会忽略cmd
                 # 4. 如果定义了 command 和 args ... 会忽略 entrypoint 和 cmd

    livenessProbe:       # <Object> 探针1  存活探针 探测容器是否存活  容器的存活性探测方式
      exec:              # 执行一些命令 探针1.1 在容器内执行任意命令,并检查命令退出状态码,如果状态码为0,则探测成功,否则探测失败容器重启
        command: ["test","-e","/tmp/healthy"]  # 命令为    test -e 为文件是否存在
      httpGet:              # 请求一些资源 探针1.2 对容器的ip地址(指定的端口和路径)执行http get请求 响应码是2xx, 3xx,则探测成功。如果服务器没有响应或者返回错误响应则说明探测失败,容器将重启。
        port: 80            # <string> -required-   端口 必有的选项      
        path: \index.html   # <string>   
      tcpSocket             # 对套接字发请求 探针1.3 探针与容器指定端口建立tcp连接,如果连接建立则探测成功,否则探测失败容器重启。
      falureThreshold:         # 探测几次失败 我们在认为是 失败 默认为3次 最小值为1
      periodSeconds: 5         # 每次探测间隔多长时间  默认10s
      timeoutSeconds:          # 每次的超时 时间是多少 默认1s
      initialDelaySeconds: 10  # 初始化延迟探测的时间  在启动后多长时间进行探测 确保启动成功去探测 默认 容器一启动就探测

    readinessProbe       # <Object> 探针2  就绪性 探针  如果探测是吧 容器会 没有 就绪状态  详细看实例3  使用方式通 livenessProbe一样
    lifecycle            # <Object> 探针3  生命周期   定义启动后和终止前的钩子的
  - name: busybox1
    image: busybox:latest
    command:                # command 第二种定义的方式 一般使用此方式
    - "/bin/sh"             # 选择执行的 shell
    - "-c"                  # 参数
    - "sleep 3600"          # 执行的命令
  nodeName:                 # <string> 指定运行在哪一个节点
  nodeSelector:             # <map[string]string> 节点选择器
    disktype: ssd           # 此为标签 只运行在 disktype 标签的值为ssd 的 节点node上
  restartPolicy: OnFailure  # <string> 重新启动容器中所有容器的策略
                            # Always     总是重启  默认状态
                            # OnFailure  只有状态为错误的时候重启  正常停止不会重启
                            # Never      不重启



#    command: ["/bin/sh","-c","sleep 3600"]






实例1. 使用 livenessProbe.exec 探针 检测 存活状态 
    # kubectl explain pods.spec.containers.livenessProbe   \\ 可查看livenessProbe的 配置参数
    # vim p2.yaml
        apiVersion: v1
        kind: Pod
        metadata:
          name: p2
          namespace: default
        spec:
          containers:
          - name: liveness-exec-container
            image: busybox:latest
            imagePullPolicy: IfNotPresent
            command: ["/bin/sh","-c","touch /tmp/healthy;sleep 30; rm -f /tmp/healthy; sleep 3600"]
            livenessProbe:
              exec:
                command: ["test","-e","/tmp/healthy"]
              initialDelaySeconds: 2
              periodSeconds: 5
    # kubectl create -f p2.yaml     \\ 创建 pods p2
    # kubectl get pods -w            \\ 可观察 启动 ... 过大概一分钟 探针生效了 会重启此容器  
    # kubectl describe pods p2        \\ 描述信息  查看pods的 详细信息
    # kubectl delete pods p2           \\ 完事 可删除pods
  

实例2. 使用 livenessProbe.httpGet 
    # kubectl explain pods.spec.containers.livenessProbe.httpGet
    # vim p3.yaml
        apiVersion: v1
        kind: Pod
        metadata:
          name: p3
          namespace: default
        spec:
          containers:
          - name: liveness-httpget-container
            image: nginx:latest
            imagePullPolicy: IfNotPresent
            ports:
            - name: http                \\ 定义了端口的名字  以下可以使用http 代替80端口
              containerPort: 80          \\ 定义了端口为 80
            livenessProbe:
              httpGet:
                port: http                 \\ 此为定义端口  现为http是由于上面定义了端口的名字 http 的端口为80 此应用名字即可 
                path: /index.html           \\ 探针 要访问的 主页
              initialDelaySeconds: 2
              periodSeconds: 5

    # kubectl create -f p3.yaml                \\ 创建 pods p3
    # kubectl get pods
    # kubectl exec -it p3 -- /bin/sh             \\ 连入  p3
        # rm -f /usr/share/nginx/html/index.html  \\ 删除主页文件 为测试探针是否生效
    # kubectl get pods                             \\ 可看到 重启过一次
    # kubectl describe pods p3                      \\ 描述信息  查看pods的 详细信息  亦可看到重启过

    # kubectl delete -f p3.yaml                       \\ 测试完可删除 通过yaml文件删除 其所创建的pods
    # kubectl delete pods p3                           \\ 完事 可删除pods




实例3. 使用 readinessProbe.httpGet    \\ 使用 就绪性 探针  容器启动到就绪会有时间差  就绪意味着可以提供服务会直接关联到server上去
    # kubectl explain pods.spec.containers.readinessProbe.httpGet  \\ 所有 以后使用pods 几乎 必须 要做 此探针
    # vim p3.yaml
        apiVersion: v1
        kind: Pod
        metadata:
          name: p4
          namespace: default
        spec:
          containers:
          - name: readiness-httpget-container
            image: nginx:latest
            imagePullPolicy: IfNotPresent
            ports:
            - name: http
              containerPort: 80
            readinessProbe:
              httpGet:
                port: http
                path: /index.html
              initialDelaySeconds: 2
              periodSeconds: 5
    # kubectl get pods  \\ 会发现 1/1   右边的1 代表 容器的个数  左边的1代表 就绪的个数 也就是 正常的个数 如果不正常
        NAME                  READY   STATUS    RESTARTS   AGE
        p4                    1/1     Running   0          5m8s
    # kubectl exec -it p4 -- /bin/sh                   \\ 连接到P4
        # rm -f /usr/share/nginx/html/index.html        \\ 删除主页文件 为测试探针是否生效
    # kubectl get pods                                   \\ 会发现 0/1 左边为0 则探针已探测出没有主页文件
    # kubectl exec -it p4 -- /bin/sh                      \\ 连接到P4
        # echo "aaaa" >> /usr/share/nginx/html/index.html  \\ 创建文件
    # kubectl get pods                                      \\ 会发现 1/1   




实例4. 使用 lifecycle                                          \\ 钩子 探针    此项目不常用 了解工作方式即可
    # kubectl explain pods.spec.containers.lifecycle
    # kubectl explain pods.spec.containers.lifecycle.postStart  \\ pods启动后的 执行的操作 如此操作失败 会被终止 重启与否取决于重启策略
    # kubectl explain pods.spec.containers.lifecycle.preStop     \\ pods被终止之前 立即执行的命令 等此命令执行完了 pods才会终止
















...............................................................................................................

常用命令
    # kubectl get pods
    # kubectl get pods -w

    # kubectl delete p2
    # kubectl create -f p2.yaml


................................................................................................................



关于查看 标签 的命令
    # kubectl get pods --show-labels            \\ 查看所有pods的标签    --show-labels 显示标签
    # kubectl get pods -L app                    \\ -L 标签  显示拥有 app标签的值
    # kubectl get pods -L app,run --show-labels   \\ 显示多个
    # kubectl get pods -l app --show-labels        \\ 过滤  只显示拥有 app 标签的 pods
    # kubectl label pods b1 name=teo1               \\ 打标签 把pods b1 打上 name为 teo1 的标签
    # kubectl get pods --show-labels                 \\ 显示刚刚打的标签
    # kubectl label pods b1 name=teo2 --overwrite     \\ 重新打标签为teo2
    # kubectl get pods -l name=teo2 --show-labels      \\ 仅查找 有标签 name=teo2 的pods
    # kubectl get pods -l name=teo2,release=stable      \\ 仅查找 有标签 name=teo2同时release=stable 的pods
        =    等于
        ==   等于
        !=   不等于
    # kubectl get pods -l "name in (teo,teo1,teo2)"     \\ 仅查找 有标签name的值为(teo,teo1,teo2)中的一个就行
        in
        notin 
    # kubectl 



标签选择器
    等值关系: =等于    ==等于    !=不等于



# kubectl get nodes --show-labels         \\ 查看所有节点 并 显示其标签

# kubectl label nodes node01 disktype=ssd   \\ 给 节点node01 打标签  可配合 nodeSelector: 使用 pods选择要运行在哪个节点上



pod 状态
    pending 挂起 条件不能满足 调度没有完成 
    running 运行
    failed  失败
    succeeded 成功
    unknown 未知









ReplicaSet                \\ 注意 要创建复杂的标签
简称 rs

    控制器 标签选择器 可以创建一个不分彼此的pods资源   可以在外面加一个 server组件使用同一个标签选择器





# kubectl  explain rs          \\ 查看 rs   ReplicaSet 可以简写成rs
# kubectl explain rs.spec




# vim rs1.yaml清单
    apiVersion: apps/v1
    kind: ReplicaSet          \\ 定义了 类型 为 ReplicaSet
    metadata:
        name: rs1
        namespace: default
    spec:
        replicas: 2               \\ 定义了数量 为 2个  会按照模板启动两个pods
        selector:                  \\ 选择器
            matchLabels:            \\ 以此定义的标签 来管理 pods 很主要
                app: rs1             \\ 标签01
                release: canary       \\ 标签02
        template:                      \\ 定了pods 模板
            metadata:
                name: rs1-pod
                labels:                   \\ 定义了模板里面的pods的标签
                    app: rs1               \\ 要符合标签01
                    release: canary         \\ 要符合标签02
                    environment: qa          \\ 标签02
            spec:
                containers:
                - name: p1                     \\ 此名字并不主要 会自动生成新的名字
                  image: nginx                  \\ 容器的镜像
                  ports:
                  - name: http
                    containerPort: 80
# kubectl create -f rs1.yaml 
# kubectl get rs                  \\ 会生成rs
    rs1             2         2         0       3s
# kubectl get pods                  \\ 会生成两个pods 但是名字并不是上面定义的
    rs1-mvxwr             1/1     Running   0          11s
    rs1-xgxd6             1/1     Running   0          11s
# kubectl describe pods rs1-mvxwr      \\ 查看 详细信息
# curl 10.244.1.12                      \\ 可正常访问
# kubectl get pods
# kubectl delete pods rs1-xgxd6           \\ 删除 一个 pods
# kubectl get pods                         \\ 会发现 会自动 新建一个pods
# kubectl get pods --show-labels 

# kubectl create -f p1.yaml                  \\ 如果多一个的话 如改另一个pods标签为rs的管理标签 rs会自动随机杀掉一个
# kubectl get pods --show-labels
# kubectl label pods p1 release=canary
# kubectl label pods p1 app=rs1 --overwrite     \\ 打成一样的标签
# kubectl get pods --show-labels                 \\ 会自动 杀掉一个

# kubectl edit rs rs1           \\ 修改rs1的配置  可以动态修改  扩容或缩蓉
    replicas: 5                  \\ 把pods数量从2个 改成5个
# kubectl get pods                \\ 会有5个pods




# kubectl edit rs rs1           \\ 更改镜像的版本
    - image: nginx:v2            \\ 修改镜像的版本 如果有的话是可以的
# kubectl rs -o wide              \\ rs 会被修改 大那是 pods 现在还未被修改 需要重新生成的pods会被使用新的镜像
# kubectl get pods -o wide
# kubectl delete pods rs1-4j776     \\ 干掉一个 会新建一个 新建的为 新的v2的镜像
# kubectl get pods -o wide           \\ 此为 金丝雀发布 如先杀掉2个使用新的 如果没有问题在杀掉其他3个
                                      \\ 蓝绿发布  详细待查询       灰度发布  详细带查询




deployment  
简称 deploy

    deployment 滚动更新可以  可以管理 创建 多个 ReplicaSet



    ReplicaSet 可以管理 创建 多个 pods

    # kubectl explain deployment
    # kubectl explain deployment.spec
        strategy 更新策略
            type Recreate             \\ <string> 重建更新 删除一个 创建一个
            type RollingUpdate         \\ 滚动更新 如果type为此项 下面 rollingUpdate定义其策略 才生效 否则下面不生效
            rollingUpdate   <Object>    \\ 定义 type 滚动更新的 策略
                maxSurge    <string>     \\ 对应的更新过程中 最多目标的副本数有几个 可直接指定数量 或者指定百分比
                maxUnavailable            \\ 最多有几个不可用 比如 有5个  此项为2 说明 最少有3个是可用的   不可以同时为0
        revisionHistoryLimit               \\ 保留多少个历史版本 默认10个
        paused                              \\ 暂停  一般不开此项上来就更新



    # kubectl explain deployment.spec.strategy.rollingUpdate




    # kubectl explain deployment.spec.template


    # kubectl explain deployment.spec.strategy




    Deployment 控制 Replica Sets 控制 pods





    # vim d.yaml
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: d1
          namespace: default
        spec:
          replicas: 2
          selector:
            matchLabels:
              app: myapp2
              release: canary2
          template:
              metadata:
                labels:
                  app: myapp2
                  release: canary2
              spec:
                containers:
                - name: myapp
                  image: nginx
                  ports:
                  - name: http
                    containerPort: 80

    # kubectl apply -f d1.yaml    \\ apply 有creat功能 也可以创建 
    # kubectl get deploy           \\ 有 deploy
    # kubectl get rs                \\ 还有 rs  只有一个 rs
    # kubectl get pods               \\ 会有 两个pods创建
    # vim d.yaml
        replicas: 3                    \\ 副本数改为3
    # kubectl apply -f d1.yaml          \\ apply 可以执行多次
    # kubectl get pods                   \\ 现在为3个
    # kubectl describe deploy d1          \\ 看到 d1 的详细信息
        RollingUpdateStrategy:  25% max unavailable, 25% max surg       \\ 默认即为滚动更新 可看到默认的更新的选项 不足25%会不足一个
    # kubectl get pods -l app=myapp2 -w   \\ 新开窗口 查看滚动更新  -l 标签只查看app=myaap2的
    # vim d.yaml                                             \\ 修改一下 镜像
        image: wodby/nginx
    # kubectl apply -f d.yaml                                  \\ 可查询 另一个窗口的 更新流程

    # kubectl get rs -o wide                                     \\ 会有 两个  rs  其中一个 是以前的模板 可以用此模板来回滚
    # kubectl rollout history deployment d1                       \\ 可以查看 滚动历史
    # kubectl patch deployments d1 -p '{"spec":{"replicas":5}}'    \\ patch 打补丁 方式修改 副本数为5
    # kubectl get pods                                              \\ 可看到 pods 数量为5个

    # kubectl explain deploy.spec.strategy.rollingUpdate              \\ 打补丁 修改更新策略  亦可以d1.yaml方式修改
    # kubectl patch deployments d1 -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
    # kubectl describe deployments d1                                   \\ 可看到更新策略为最多可以多1个 不能少
        RollingUpdateStrategy:  0 max unavailable, 1 max surge

    # kubectl get pods -l app=myapp2 -w            \\ 新开窗口 继续查看更新状态
    # kubectl set image deployment d1 myapp=nginx && kubectl rollout pause deployment d1   \\ 使用命令 更新镜像版本 立即执行暂停 可看更新状态 金丝雀发布
    # kubectl rollout status deployment d1           \\ 也可以查看更新过程

    # kubectl rollout resume deployment d1             \\ 继续 更新
    # kubectl get rs -o wide                            \\ 应该会看到有三个版本 但是这里只用了两个镜像 只有两个版本
    # kubectl rollout history deployment d1              \\ 可查看一共有几个版本
    # kubectl rollout undo deployment d1                  \\ 回滚到上一个版本
    # kubectl rollout undo deployment d1 --to-revision=1   \\ 也可指明 回滚到指定版本
    # kubectl rollout history deployment d1                 \\ 出现新的版本 刚刚回滚的版本也没有了 会替换为新的版本
    # kubectl get rs -o wide                                 \\ 可看到 当前正在工作的版本是 上一个版本了


...............................................................................................................................

DaemonSet  在每一个节点上要运行一个资源  在整个集群个每一个节点上只运行某个指定pods的一个 并且只一个副本 或者在集群中符合选择器的节点上,每一个节点只运行指定的pods副本 用于系统级的管理功能 可以直接把节点上的某个目录作为存储卷关联至pods中,让pods实现某些管理功能


简称 ds     待看.........................



# vim ds1.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: redis
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: redis
          role: logstor
      template:
          metadata:
            labels:
              app: redis
              role: logstor
          spec:
            containers:
            - name: redis
              image: redis:4.0-alpine
              ports:
              - name: redis
                containerPort: 6379
    ---                                      \\ --- 来隔开 资源
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: ds1
      namespace: default
    spec:
      selector:
        matchLabels:
          app: filebeat
          release: stable
      template:
          metadata:
            labels:
              app: filebeat
              release: stable
          spec:
            containers:
            - name: filebeat
              image: ikubernetes/filebeat:5.6.5-alpine
              env:
              - name: REDIS_HOST
                value: redis.default.svc.cluster.local
              - name: REDIS_LOG_LEVEL
                value: info

# kubectl apply -f ds1.yaml
# kubectl expose deployment redis --port=6379


# kubectl get svc                                    \\ service 简称 svc
# kubectl exec -it redis-56fd57fd76-nnfqx -- /bin/sh  \\ 
    # netstat -tnl                                     \\ 6379已经是监听的
    # nslookup redis.default.svc.cluster.local          \\ 可以解析成功
    # redis-cli -h redis.default.svc.cluster.local       \\ 连接进入redis
        keys *                                            \\ 查看 键值  发现为空
        exit
# kubectl get pods
# kubectl exec -it ds1-8r7st -- /bin/sh
    # ps aux                             \\ 查看 redis 运行状态
    # cat /etc/filebeat/filebeat.yml      \\ 查看 redis 配置文件
    # printenv                             \\ 查看 环境变量
        REDIS_HOST=redis.default.svc.cluster.local       \\ 名称解析   会有








    # kubectl get pods              \\ 可看到ds1 已经运行起来了
    # kubectl logs ds1-cj7c2         \\ 查看日志









IP:178.20.210.111
  端口:48999
  密钥:ee376ba8d9d75bc4a5067b94a3d168421d37306539626363393666626235636665633833316663353730376266356431612e636f6d

Teo

17条评论

Refugia 发布于23:00 - 2021年4月7日

Hello! This post could not be written any better!
Reading this post reminds me of my previous room mate!

He always kept chatting about this. I will forward this page to him.
Fairly certain he will have a good read. Thanks for sharing!

Here is my blog free spins

Nolan 发布于04:30 - 2021年3月24日

bookmarked!!, I love your blog!

My web site https://www.npmjs.com/package/ggxs-bdg?activeTab=readme

Zack 发布于02:27 - 2021年3月20日

Thanks for some other fantastic post. Where else may just anyone get that kind of info in such a perfect approach
of writing? I’ve a presentation subsequent week, and I’m on the look for such info.

Also visit my website: http://latest-free-robux-2021.gq

Lionel 发布于01:07 - 2021年3月20日

Today, I went to the beach front with my kids. I found a sea shell and gave it
to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She placed the shell to
her ear and screamed. There was a hermit crab inside and it pinched her ear.

She never wants to go back! LoL I know this is totally off
topic but I had to tell someone!

Also visit my web blog … http://way-to-get-free-robux-daily.ga

Antwan 发布于00:54 - 2021年3月20日

It’s a pity you don’t have a donate button! I’d definitely donate to this fantastic blog!
I suppose for now i’ll settle for bookmarking and adding your RSS feed to my Google account.

I look forward to brand new updates and will talk about this blog
with my Facebook group. Chat soon!

my homepage; http://is-there-a-way-to-get-free-robux.cf

Shawna 发布于00:06 - 2021年3月20日

Hello just wanted to give you a quick heads up.

The text in your content seem to be running off the screen in Opera.
I’m not sure if this is a format issue or
something to do with internet browser compatibility but I
figured I’d post to let you know. The design and style look great though!
Hope you get the problem solved soon. Kudos

Visit my blog robux generator

Della 发布于22:59 - 2021年3月19日

I seriously love your website.. Very nice colors & theme.
Did you build this amazing site yourself? Please reply back as I’m looking
to create my own personal website and want to learn where
you got this from or exactly what the theme is named.
Many thanks!

Feel free to surf to my site :: how to get free robux

Brooks 发布于21:57 - 2021年3月19日

What’s up mates, nice piece of writing and nice urging
commented here, I am actually enjoying by these.

Here is my web page :: http://how-do-you-get-free-robux.gq

Darren 发布于20:53 - 2021年3月19日

I’m really impressed with your writing skills
and also with the layout on your blog. Is this a paid theme
or did you modify it yourself? Anyway keep up the nice
quality writing, it is rare to see a great blog like this one today.

Also visit my site … free robux generator

Nick 发布于19:01 - 2021年3月19日

Hi there, I wish for to subscribe for this website to get most up-to-date updates, so where can i do it
please help out.

my web site how to get free robux

Iesha 发布于06:34 - 2021年3月13日

Hey! This is my first comment here so I just wanted
to give a quick shout out and say I truly enjoy reading through your blog posts.
Can you recommend any other blogs/websites/forums that deal
with the same subjects? Thank you so much!

My webpage cpi.udel.edu/files/formidable/10/free-fortnite-vbucks-generator-vbucks-for-f_FH26M.pdf

Virginia 发布于22:25 - 2021年3月11日

Hello there, just became alert to your blog through Google, and found that it’s truly informative.
I am gonna watch out for brussels. I’ll be grateful if you continue this in future.
Numerous people will be benefited from your writing. Cheers!

Here is my web site https://www.instapaper.com/p/gludherskind2

Sienna 发布于23:23 - 2021年3月6日

you are in point of fact a excellent webmaster.
The web site loading pace is amazing. It kind of feels that
you’re doing any unique trick. Moreover, The contents are masterwork.
you have performed a magnificent process in this matter!

Stop by my homepage … robux generator

Travis 发布于22:06 - 2021年3月6日

Ahaa, its nice conversation regarding this
paragraph at this place at this weblog, I have read all that, so at this time
me also commenting at this place.

Look into my homepage: free robux

Edmundo 发布于03:15 - 2021年3月6日

I have learn some good stuff here. Certainly price bookmarking for
revisiting. I surprise how a lot attempt you set to make the sort of excellent informative web site.

Feel free to surf to my blog post free robux codes

Vera 发布于01:44 - 2021年3月6日

I could not refrain from commenting. Perfectly written!

Look into my webpage … alice

Serena 发布于03:15 - 2021年3月5日

First of all I would like to say awesome blog! I had
a quick question that I’d like to ask if you do not mind.
I was interested to know how you center yourself and clear your thoughts prior to writing.
I’ve had a tough time clearing my thoughts in getting my ideas out there.

I truly do enjoy writing but it just seems like the first 10 to 15 minutes tend to
be lost just trying to figure out how to begin. Any recommendations or hints?
Kudos!

Also visit my website :: http://s3.amazonaws.com/appforest_uf/f1614792950103x750204350217306600/sword-free-fortnite-vbucks-generator-vbucks-for-f.pdf

You must be logged in to post a comment