作者:Teo

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

centos7_l2tp_ipsec_vpn_脚本.sh

#!/bin/bash

# <UDF name="VPN_IPSEC_PSK" Label="IPsec Pre-Shared Key" />
# <UDF name="VPN_USER" Label="VPN Username" />
# <UDF name="VPN_PASSWORD" Label="VPN Password" />

if [ -f /etc/apt/sources.list ]; then
  url=vpnsetup
  apt-get -y update
  apt-get -y install wget
elif [ -f /etc/yum.conf ]; then
  url=vpnsetup-centos
  yum -y install wget
else
  echo "Your distribution is not supported by this StackScript"
  exit 1
fi

wget "https://git.io/$url" -O /tmp/vpn.sh && sh /tmp/vpn.sh && rm -f /tmp/vpn.sh

# Fix xl2tpd on CentOS 7 for Linode VMs, because kernel module
# l2tp_ppp is not available in the default Linode kernel
if grep -qs "release 7" /etc/redhat-release; then
  if [ -f /usr/lib/systemd/system/xl2tpd.service ]; then
    sed -i '/ExecStartPre/s/^/#/' /usr/lib/systemd/system/xl2tpd.service
    systemctl daemon-reload
    systemctl restart xl2tpd
  fi
fi