k8s基础

  •  k8s中pod配置文件详解

[root@leader /zpf/k8s/resource]$cat nginx-demo.yaml
apiVersion: v1 #api文档版本
kind: Pod #资源对象类型,可以是Pod,Deployment,StatefulSet,等相关对象
metadata:
  name: nginx-demo ##Pod 的名称
  labels: #定义pod的标签
    type: app
    test: 1.0.0 #自定义pod的版本号
  namespace: 'default' #命名空间的配置
spec: ##期望Pod按照这里的描述进行创建
  terminationGracePeriodSeconds: 40 #当被删除的时候,给pod预留多少时间的停止预留时间.
  containers: #对于pod中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 #z指定容器的景象以及版本号
    imagePullPolicy: IfNotPresent #镜像拉取策略 这里的意思是总是拉取最新镜像,Never 表示仅使用本地镜像, ifNotPresent 表示如果本地有就用本地的
    lifecycle: #生命周期的配置
      postStart:  #生命周期启动阶段做的事情,不一定在容器的command之前运行
        exec:
          command:
          - sh
          - -c
          - "echo '<h1>pre stop</h1>' > /usr/share/nginx/html/poststop.html"
      preStop: #生命周期结束阶段要做的事情.
        exec:
          command:
          - sh
          - -c
          - "sleep 50;echo 'sleep finished ...' >> /usr/share/nginx/html/poststop.html "
    command:
    - nginx
    - -g
    - 'daemon off;'  #指定容器启动时执行的命令,这里要添加;分号,表示命令结束.
    workingDir: /usr/share/nginx/html #定义容器启动后的工作目录
    ports:
    - name: http #端口名称
      containerPort: 80 #描述容器内要暴漏什么端口
      protocol: TCP #描述该端口是基于那种协议
    env:  #环境变量信息
    - name: JVM_OPTS  #环境变量名称
      value: '-Xms128m -Xmx128m' #环境变量的值
    resources:
      requests:
        cpu: 100m #表示使用0.1个核心. 1000m表示使用一个核心.
        memory: 128Mi #这里表示使用多少M内存空间
      limits:
        cpu: 200m #表示cpu最多使用0.2个核心
        memory: 256Mi #内存最多使用256M
  restartPolicy: Always #服务重启策略,OnFailure,表示异常情况下退出时才会进行重启.Never表示从不重启该pod  这里配置的是Always 表示无论什么情况都会重启
  • 添加label可以在命令行中直接添加临时lable标签.

使用配置文件创建 pod
kubectl apply -f nginx-demo.yaml
查看创建好的pod中的标签
kubectl get pod nginx-demo --show-labels
临时修改pod中的标签信息
kubectl label po nginx-demo language=java
  • 也可以使用修改配置文件来修改label信息.

[root@leader /zpf/k8s/resource]$cat nginx-demo.yaml
apiVersion: v1 #api文档版本
kind: Pod #资源对象类型,可以是Pod,Deployment,StatefulSet,等相关对象
metadata:
  name: nginx-demo ##Pod 的名称
  labels: #定义pod的标签
    type: app
    test: 1.0.0 #自定义pod的版本号
    language: java  #这里添加一个label信息到配置文件中.
  namespace: 'default' #命名空间的配置
spec: ##期望Pod按照这里的描述进行创建
  terminationGracePeriodSeconds: 40 #当被删除的时候,给pod预留多少时间的停止预留时间.
  containers: #对于pod中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 #z指定容器的景象以及版本号
    imagePullPolicy: IfNotPresent #镜像拉取策略 这里的意思是总是拉取最新镜像,Never 表示仅使用本地镜像, ifNotPresent 表示如果本地有就用本地的
    lifecycle: #生命周期的配置
      postStart:  #生命周期启动阶段做的事情,不一定在容器的command之前运行
        exec:
          command:
          - sh
          - -c
          - "echo '<h1>pre stop</h1>' > /usr/share/nginx/html/poststop.html"
      preStop: #生命周期结束阶段要做的事情.
        exec:
          command:
          - sh
          - -c
          - "sleep 50;echo 'sleep finished ...' >> /usr/share/nginx/html/poststop.html "
    command:
    - nginx
    - -g
    - 'daemon off;'  #指定容器启动时执行的命令,这里要添加;分号,表示命令结束.
    workingDir: /usr/share/nginx/html #定义容器启动后的工作目录
    ports:
    - name: http #端口名称
      containerPort: 80 #描述容器内要暴漏什么端口
      protocol: TCP #描述该端口是基于那种协议
    env:  #环境变量信息
    - name: JVM_OPTS  #环境变量名称
      value: '-Xms128m -Xmx128m' #环境变量的值
    resources:
      requests:
        cpu: 100m #表示使用0.1个核心. 1000m表示使用一个核心.
        memory: 128Mi #这里表示使用多少M内存空间
      limits:
        cpu: 200m #表示cpu最多使用0.2个核心
        memory: 256Mi #内存最多使用256M
  restartPolicy: Always #服务重启策略,OnFailure,表示异常情况下退出时才会进行重启.Never表示从不重启该pod  这里配置的是Always 表示无论什么情况都会重启

这里在配置文件中添加了一个languang:java的标签.

使用命令行获取指定标签下的pod.

kubectl get po  -l language=java

 查看指定label下的对应的pod,并查看该pod的所有的label信息.

kubectl get po -l language=java --show-labels

通过条件删选label标签对应的pod信息,

kubectl get pod -l 'test in (1.0.0,1.1.0,1.2.0)'
这表示test标签的值是1.0.0 或者 1.1.0 或者1.2.0 满足任意一个test value就可以被查询出来.

查询条件指定排除某些条件进行查询.

kubectl get pod -l version!=1.2.0,language=java --show-labels
这里表示满足version!= 1.2.0 并且language=java的pod筛选出来
  • 一个简单的deployment的相关信息注解

apiVersion: apps/v1   #deploy api版本
kind: Deployment  #资源类型为deployment
metadata:  #原数据标签
  labels: #标签
    app: nginx-deploy   #这里是deploy的label标签用来与后面的rs与pod进行关联
  name: nginx-deploy  #deployment 名字
  namespace: default  #默认命名空间
spec:  #
  replicas: 1  #期望副本数
  revisionHistoryLimit: 10  #进行滚动更新后,保留的历史版本数量
  selector:  #选择器,用于找到匹配的RS
    matchLabels:  #按照标签匹配
      app: nginx-deploy  #在deploy中关联rs的字段使用的就是selector
  strategy:
    rollingUpdate:  #滚动更新配置
      maxSurge: 25% #表示在更新的时候可以有25%额外的pod出现.超过期望副本数的比例是25%
      maxUnavailable: 25%  #最多可以允许25%的pod在更新时处于不可用状态.
    type: RollingUpdate  #更新类型,指定为滚动更新
  template:  #pod模板,
    metadata: #pod原数据信息
      labels: #pod标签
        app: nginx-deploy  #这里是rs与pod之间的关联字段
    spec:  #pod期望信息
      containers:  #破的容器相关信息
      - image: nginx:1.7.9  #pod使用的镜像版本
        imagePullPolicy: IfNotPresent  #pod镜像拉取策略
        name: nginx  #pod名称
      restartPolicy: Always  #重启策略
      terminationGracePeriodSeconds: 30 #宽限时间
 #说明一下,这里三个资源类型的关联就是使用文中的nginx-deploy来进行关联的.

说明一下,label标签中如果有数字类型,那么需要使用引号引起来.因为label标签中默认支持string类型,

deployment滚动更新

一般滚动更新的触发条件是修改了pod的版本号会触发重新拉取镜像的操作,这个过程会触发滚动更新,滚动更新结果可以使用

[root@leader /zpf/k8s/resource]$kubectl get deploy -w
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   3/3     3            3           34m

其中 

UP-TO-DATE: 字段表示的就是容器更新次数.

AVAILABLE : 表示当前最大可用副本数,

或者使用

$kubectl rollout status deploy nginx-deploy 

deployment "nginx-deploy" successfully rolled out

查看表示这个deployment已经滚动更新完成

如果想要查看滚动更新的历史过程可以使用

$kubectl describe deploy nginx-deploy
.
.
.
Events:
  Type    Reason             Age                From                   Message
  ----    ------             ----               ----                   -------
  Normal  ScalingReplicaSet  45m                deployment-controller  Scaled up replica set nginx-deploy-845964f5bf to 3
  Normal  ScalingReplicaSet  37m                deployment-controller  Scaled up replica set nginx-deploy-845964f5bf to 5
  Normal  ScalingReplicaSet  15m                deployment-controller  Scaled down replica set nginx-deploy-845964f5bf to 3
  Normal  ScalingReplicaSet  12m                deployment-controller  Scaled down replica set nginx-deploy-845964f5bf to 0
  Normal  ScalingReplicaSet  11m                deployment-controller  Scaled up replica set nginx-deploy-845964f5bf to 1
  Normal  ScalingReplicaSet  11m                deployment-controller  Scaled down replica set nginx-deploy-968b78ccf to 2
  Normal  ScalingReplicaSet  11m (x2 over 12m)  deployment-controller  Scaled up replica set nginx-deploy-968b78ccf to 2
  Normal  ScalingReplicaSet  11m (x2 over 14m)  deployment-controller  Scaled up replica set nginx-deploy-968b78ccf to 1
  Normal  ScalingReplicaSet  11m (x2 over 12m)  deployment-controller  Scaled down replica set nginx-deploy-845964f5bf to 2
  Normal  ScalingReplicaSet  11m (x2 over 12m)  deployment-controller  Scaled down replica set nginx-deploy-845964f5bf to 1
  Normal  ScalingReplicaSet  11m (x2 over 12m)  deployment-controller  Scaled up replica set nginx-deploy-968b78ccf to 3
  Normal  ScalingReplicaSet  11m (x5 over 11m)  deployment-controller  (combined from similar events): Scaled down replica set nginx-deploy-845964f5bf to 0

其中Events中会详细的记录滚动更新的过程.包括每次新建副本的数量以及结束副本的数量.

查看deploy历史版本,

这里说明一下,只有重新拉取镜像操作才会出发版本更新,只有副本数的变化不属于版本更新,

说明一下,先决条件1,

        在更新版本的时候不要使用kubectl delete rs nginx-deploy 删除历史rs信息.会导致版本的缺失.因为在回退的时候会用deploy与rs进行关联,如果将rs删除,那么就无将两者进行关联,导致无法找到回滚版本,

先决条件2,

        要在deploy的yaml文件中注明,revisionHistorylimit:10 表示留存过去10个版本.如果没有声明的话那么就无法保留历史版本信息,就无法进行回滚.

spec:  #
  replicas: 3  #期望副本数
  revisionHistoryLimit: 10  #进行滚动更新后,保留的历史版本数量
  • 查看deployment的历史版本信息.历史版本不会显示当前正在运行的版本.
$kubectl rollout history deployment nginx-deploy
deployment.apps/nginx-deploy
REVISION  CHANGE-CAUSE
4         <none>
5         <none>

查看指定版本的deployment信息.

$kubectl rollout history deployment nginx-deploy --revision=4
deployment.apps/nginx-deploy with revision #4
Pod Template:
  Labels:	app=nginx-deploy
	pod-template-hash=968b78ccf
  Containers:
   nginx:
    Image:	nginx:1.9.1
    Port:	<none>
    Host Port:	<none>
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>

使用命令退回之前指定版本操作

$kubectl rollout undo deploy nginx-deploy --to-revision=4
deployment.apps/nginx-deploy rolled back
$kubectl rollout undo deploy nginx-deploy --to-revision=5
deployment.apps/nginx-deploy rolled back

更新后的版本会进行版本递增操作.被回滚的版本会变成新的版本.

$kubectl rollout history deploy nginx-deploy
deployment.apps/nginx-deploy
REVISION  CHANGE-CAUSE
6         <none>
7         <none>

  • deployment 扩缩容

使用scale进行deploy的扩缩容服务.可以直接进行副本数量的变更,副本数变更不属于版本变更,所以不适用于版本回滚.

 这里使用sacle将 nginx-deploy的副本数扩容到5个.

$kubectl scale --replicas=5 deploy nginx-deploy
deployment.apps/nginx-deploy scaled
[root@leader /zpf/k8s/resource]$kubectl get deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   5/5     5            5           138m

缩容方式同理,将--replicas的数量变更成指定数量即可.

  • deployment暂停与恢复

暂停已经启动的deployment,这里的暂停是指服务版本以及修改的版本等信息是无法直接更新的,(针对edit来说的),

这里使用rollout pause 来暂停指定的deployment

$kubectl rollout pause deploy nginx-deploy
deployment.apps/nginx-deploy paused

deployment暂停后可以修改容器版本修改资源分配信息等.kubectl edit 操作的相关内容,这里踩了一个坑,

在使用edit的时候,编辑yaml的过程中使用了tab键作为空格使用,最终文件修改完成后报错.这里强烈建议使用空格替换tab键.

使用rollout resume 来恢复deploy的状态信息,

$kubectl rollout resume deploy nginx-deploy
deployment.apps/nginx-deploy resumed

deployment恢复后会导致一次性将所有的修改过程都进行相应的变更操作.例如第一次修改的是request 信息,第二次修改的是,Limite相关信息,在使用 rollout resume之后会一次性将修改操作同时进行操作,

  • 创建有状态的应用statefulset

 使用sts类型的yaml文件创建一个有状态的应用.其中包含svc与sts

[root@leader /zpf/k8s/statefulset]$cat web.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet  #创建一个statefulset类型的资源
metadata:
  name: web #statefulset 对象的名字
spec:
  serviceName: "nginx" #使用哪个service 来管理dns
  replicas: 5  #副本数
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx  #pod的名称 是nginx
    spec:
      containers:
      - name: nginx  #容器名称
        image: nginx:1.7.9  #容器版本
        ports:  #容器内部要暴漏的端口
        - containerPort: 80  #容器暴漏端口
          name: web #容器端口名称

sts扩缩容

使用命令行对sts进行扩缩容.

使用命令行对已有的sts服务进行扩缩容操作.
[root@leader /zpf/k8s/statefulset]$kubectl scale sts web --replicas=2
将replicas变更成指定的数值即可对现有的sts进行扩缩容操作.

使用配置文件对现有的sts进行扩缩容操作

[root@leader /zpf/k8s/statefulset]$cat web.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet  #创建一个statefulset类型的资源
metadata:
  name: web #statefulset 对象的名字
spec:
  serviceName: "nginx" #使用哪个service 来管理dns
  replicas: 5  #副本数
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx  #pod的名称 是nginx
    spec:
      containers:
      - name: nginx  #容器名称
        image: nginx:1.7.9  #容器版本
        ports:  #容器内部要暴漏的端口
        - containerPort: 80  #容器暴漏端口
          name: web #容器端口名称

将上面的replicas的值修改成自己需要的副本数量即可.

然后通过

[root@leader /zpf/k8s/statefulset]$kubectl get sts
NAME   READY   AGE
web    2/2     4d23h
查看当前副本是否达到终态.

[root@leader /zpf/k8s/statefulset]$kubectl describe sts web
...
Events:
  Type    Reason            Age                  From                    Message
  ----    ------            ----                 ----                    -------
  Normal  SuccessfulDelete  7m2s (x2 over 10m)   statefulset-controller  delete Pod web-4 in StatefulSet web successful
  Normal  SuccessfulDelete  7m1s (x2 over 10m)   statefulset-controller  delete Pod web-3 in StatefulSet web successful
  Normal  SuccessfulDelete  7m (x2 over 10m)     statefulset-controller  delete Pod web-2 in StatefulSet web successful
  Normal  SuccessfulCreate  6m45s (x3 over 11m)  statefulset-controller  create Pod web-2 in StatefulSet web successful
  Normal  SuccessfulCreate  6m44s (x3 over 11m)  statefulset-controller  create Pod web-3 in StatefulSet web successful
  Normal  SuccessfulCreate  6m43s (x3 over 11m)  statefulset-controller  create Pod web-4 in StatefulSet web successful

查看当前sts的创建过程.以及其他详细信息.

sts是不支持直接更新image来更新pod的.需要使用patch的方式.使用补丁来进行sts的更新操作.
 

在k8s中使用金丝雀发布sts.并做指定数量的金丝雀发布.

 说明一下,其中的

  updateStrategy:
    rollingUpdate:
      partition: 1
    type: RollingUpdate

sts对应的yaml文件中的partition对应的数量表示更新哪一些pod.例如,一共5个副本.这里标注的是partition:1 表示除了1号副本之外其余所有的副本均进行更新操作.保留1号副本.
所以在进行sts持久化操作后进行更新操作,需要知道一共有多少pod副本,然后将副本按照要求进行部分升级操作.达到影响面最小的成度. 

[root@leader /zpf/k8s/statefulset]$kubectl get sts web -o yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"web","namespace":"default"},"spec":{"replicas":2,"selector":{"matchLabels":{"app":"nginx"}},"serviceName":"nginx","template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx","ports":[{"containerPort":80,"name":"web"}]}]}}}}
  creationTimestamp: "2023-09-20T03:03:23Z"
  generation: 12
  name: web
  namespace: default
  resourceVersion: "261014"
  uid: 157e795e-0233-418c-ba34-62e644a4a732
spec:
  podManagementPolicy: OrderedReady
  replicas: 5
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  serviceName: nginx
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.9.1
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: web
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
  updateStrategy:
    rollingUpdate:
      partition: 1
    type: RollingUpdate
status:
  availableReplicas: 5
  collisionCount: 0
  currentReplicas: 1
  currentRevision: web-6c5c7fd59b
  observedGeneration: 12
  readyReplicas: 5
  replicas: 5
  updateRevision: web-6bc849cb6b
  updatedReplicas: 4

查看金丝雀发布后的版本信息是否达到终态

[root@leader /zpf/k8s/statefulset]$kubectl describe po web-2
Name:         web-2
Namespace:    default
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  10m   default-scheduler  Successfully assigned default/web-2 to leader
  Normal  Pulled     10m   kubelet            Container image "nginx:1.9.1" already present on machine
  Normal  Created    10m   kubelet            Created container nginx
  Normal  Started    10m   kubelet            Started container nginx

说明一下:这里看到的内容是表示已经将container更新完成,镜像版本是nginx-1.9.1.

而没有进行更新的版本如下:

[root@leader /zpf/k8s/statefulset]$kubectl describe po web-0
Name:         web-0
Namespace:    default
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  31m   default-scheduler  Successfully assigned default/web-0 to leader
  Normal  Pulled     31m   kubelet            Container image "nginx:1.7.9" already present on machine
  Normal  Created    31m   kubelet            Created container nginx
  Normal  Started    31m   kubelet            Started container nginx

这里看到pod版本号为1.7.9而不是其他pod的版本号1.9.1.表示剩余一个pod未进行更新操作.如果需要更新操作的话将sts web的yaml文件中的

  updateStrategy:
    rollingUpdate:
      partition: 0

将partition:1 修改成 partition:0 即可全量进行更新.

使用ondelete进行sts更新,较为简单,这里省略

给node节点打标签.

[root@leader /ks]$kubectl label no node1 type=microservices
node/node1 labeled

查看node节点上的标签信息
[root@leader /ks]$kubectl get node --show-labels|grep node1
node1    Ready    worker                        14m   v1.23.10   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,type=microservices

这里显示的是刚刚添加的标签已经添加完成.

说明一下.demoset类型在部署的时候同一个ds在同一台node节点上只能部署一个.ds是没有副本概念的.只要满足部署的标签信息,那么都可以在指定的node集群上进行部署.且只能部署一个pod.

一个简单的demonset示例'

apiVersion: apps/v1  #api版本是apps/v1
kind: DaemonSet  #创建一个Daemon类型的资源
metadata:
  name: fluentd  #设置deamoset的名字
spec:  #Daemon自己的内容信息
  selector:
    matchLabels:
      app: logging #要与下面的template进行匹配
  template:   #自己的配置模板
    metadata: #自己的原数据
      labels: #标签信息
        app: logging #标签信息为app
        id: fluentd #标签信息为fluebtd
      name: fluentd  #pod的名字
    spec:
      nodeSelector:
        type: microservices  #节点选择器,这里的节点选择器是pod对node的选择.只有满足标签信息才可以部署上.
      containers:
      - name: fluentd-es #容器名称为 fluentd-es
        image: agilestacks/fluentd-elasticsearch:v1.3.0 #容器使用的镜像是哪个版本
        env: #设置环境变量信息
         - name: FLUENTD_ARGS #这里设置的是fluentd的使用参数.环境变量的key
           value: -qq #表示日志标准输出 环境变量的value
        volumeMounts:  #
         - name: containers  #数据卷名称
           mountPath: /var/lib/docker/containers #容器内的目录,
         - name: varlog #数据卷名称
           mountPath: /varlog  #容器内目录,
      volumes: #定义数据卷
         - hostPath:  #数据卷类型,主机路径模式,也就是与node共享目录
             path: /var/lib/docker/containers   #宿主机中的共享目录
           name: containers # 定义的数据卷名称,用来与容器中的挂载目录进行关联.
         - hostPath:
             path: /var/log #宿主机(node)节点上的目录,
           name: varlog #与pod中的挂载项目进行匹配,将宿主机上的这个目录挂载到容器中的varlog目录下.

这里说明一下.nodeselect标签是pod选择node的标签.满足指定标签才满足调度信息.

  updateStrategy:
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
    type: RollingUpdate

将原本的
type: RollingUpdate 滚动更新类型修改成

  updateStrategy:
    type: OnDelete
滚动更新在demonset资源类型的情况下.会浪费资源.
所以可以有针对性的进行设置更新策略

  • 使用HPA对实现自动扩缩容操作

# 下载 metrics-server 组件配置文件

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

# 修改镜像地址为国内的地址

将镜像下载仓库地址变更成国内阿里云镜像仓库地址.
sed -i 's/k8s.gcr.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
如果修改不成功可以手动修改

# 修改容器的 tls 配置,不验证 tls,在 containers 的 args 参数中增加 --kubelet-insecure-tls 参数 


apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - nodes/metrics
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls  #这里添加一下免tls证书认证操作.
  #      image: registry.k8s.io/metrics-server/metrics-server:v0.6.4  #将这里原来的国外镜像仓库变更成国内镜像仓库地址.
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.4
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 4443
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
        resources:
          requests:
            cpu: 100m
            memory: 200Mi
        securityContext:
          allowPrivilegeEscalation: false
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
        - mountPath: /tmp
          name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
      - emptyDir: {}
        name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100

# 安装组件

[root@leader /zpf]$kubectl apply -f metrics-server-components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

# 查看 pod 状态


[root@leader /zpf]$kubectl get pods --all-namespaces | grep metrics
kube-system   metrics-server-577cb8cd69-qsb52            1/1     Running   0             9m34s

到此为止metrics组件安装完成

设置 某一个deploy进行hpa的自动扩缩容,

#这里使用cpu来进行deploy中pod的扩缩容服务.

kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5

这里的意思是 设置nginx-deploy做自动伸缩操作.

 --cpu-percent=20 表示cpu占比是20% 超过这个值就做pod扩容操作.

--min=2 表示这个deploy最小副本数是2.

--max=5 表示这个deploy最大副本数是5.

查询hpa当前的状态属性.

[root@leader /zpf/deployment]$kubectl get hpa
NAME           REFERENCE                 TARGETS   MINPODS   MAXPODSREPLICAS   AGE
nginx-deploy   Deployment/nginx-deploy   0%/20%    2         52          118m

service的使用

书写svc的yaml文件

[root@leader /zpf/svc]$vim nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    app: nginx-svc
spec:
  ports:
  - name: http # service 端口配置的名称
    protocol: TCP # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCP
    port: 80 # service 自己的端口
    targetPort: 80 # 目标 pod 的端口
  selector: # 选中当前 service 匹配哪些 pod,对哪些 pod 的东西流量进行代理
    app: nginx-deploy

svc中如果不写使用的类型默认使用的是ClusterIP类型.

如果指定nodeport类型的话那么才是nodeport类型

endpoint的使用

可以自己设置endpoint来做集群内部向外部的代理访问,

apiVersion: v1
kind: Endpoints
metadata:
  labels:
    app: nginx
  name: nginx-svc-external
  namespace: default
subsets:
- addresses:
  - ip: 120.78.159.177
  ports:
  - name: web
    port: 80
    protocol: TCP

将subsets:
- addresses:
  - ip: 120.78.159.177

指定要访问外部的ip即可访问对应的外网服务.

[root@leader /zpf/helm/ingress-nginx]$tar xf ingress-nginx-4.4.2.tgz
[root@leader /zpf/helm/ingress-nginx]$cd ingress-nginx/
[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$ls
CHANGELOG.md  changelog.md.gotmpl  Chart.yaml  ci  OWNERS  README.md  README.md.gotmpl  templates  values.yaml
这里需要修改values.yaml文件,修改相应的仓库以及镜像信息.

5.修改values中的仓库以及镜像信息

并将哈希校验信息进行注释操作.
[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$vim values.yaml
 21 #    registry: registry.k8s.io
 22     registry: registry.cn-hangzhou.aliyuncs.com
 23     image: google_containers/nginx-ingress-controller

 28 #    digest: sha256:4ba73c697770664c1e00e9f968de14e08f606ff961c76e5d7033a4a9c593c629
 29 #    digestChroot: sha256:c1c091b88a6c936a83bd7b098662760a87868d12452529bad0d178fb36147345
#修改dns策略
 67   #dnsPolicy: ClusterFirst
 68   dnsPolicy: ClusterFirstWithHostNet


#修改主机网络类型
 90 #  hostNetwork: false
 91   hostNetwork: true


#修改资源类型为DaemonSet
194   # -- Use a `DaemonSet` or `Deployment`
195 #  kind: Deployment
196   kind: DaemonSet

#修改节点选择器,添加一个ingress类型
294   nodeSelector:
295     kubernetes.io/os: linux
296     ingress: "true"

修改service类型为ClusterIP
512     #type: LoadBalancer
513     type: ClusterIP

修改证书认证信息,将enabled:true,修改为false
605   admissionWebhooks:
606     annotations: {}
607     # ignore-check.kube-linter.io/no-read-only-rootfs: "This deployment needs write access to root filesystem".
608
609     ## Additional annotations to the admission webhooks.
610     ## These annotations will be added to the ValidatingWebhookConfiguration and
611     ## the Jobs Spec of the admission webhooks.
612 #    enabled: true
613     enabled: false



#修改patch仓库以及镜像信息.修改tag信息.将哈希校验信息注释掉.
657     patch:
658       enabled: true
659       image:
660 #        registry: registry.k8s.io
661         registry: registry.cn-hangzhou.aliyuncs.com
662 #        image: ingress-nginx/kube-webhook-certgen
663         image: google_containers/kube-webhook-certgen
664         ## for backwards compatibility consider setting the full image url via the repository value below
665         ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail
666         ## repository:
667 #        tag: v20220916-gd32f8c343
668         tag: v1.3.0
669 #        digest: sha256:39c5b2e3310dc4264d638ad28d9d1d96c4cbb2b2dcfb52368fe4e3c63f61e10f
670         pullPolicy: IfNotPresent

6.为ingress创建一个单独的命名空间.

[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$kubectl create ns ingress-nginx
namespace/ingress-nginx created
[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$kubectl get ns
NAME              STATUS   AGE
default           Active   11d
ingress-nginx     Active   3s
kube-node-lease   Active   11d
kube-public       Active   11d
kube-system       Active   11d
kubekey-system    Active   11d

7.预先给想要部署ingress的节点打上一个标签.后续部署的时候可以直接选择标签进行部署操作.

[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$kubectl label node leader ingress=true
node/leader labeled

[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$kubectl get node leader --show-labels|grep ingress
leader   Ready    control-plane,master,worker   11d   v1.23.10   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=leader,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node-role.kubernetes.io/worker=,node.kubernetes.io/exclude-from-external-load-balancers=

可以看到已经在leader节点上添加了label标签. ingress=true

8.安装ingress-nginx

这里有一点小插曲.因为配置文件修改的时候有证书认证被忽略了.导致helm已经创建相关的服务信息.但是最终创建失败.需要将创建好的ingress-nginx删除后重新创建.步骤如下

首先查看指定命名空间下的helm服务
[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$helm -n ingress-nginx ls -a
NAME         	NAMESPACE    	REVISION	UPDATED                                	STATUS	CHART              	APP VERSION
ingress-nginx	ingress-nginx	1       	2023-10-08 14:47:06.397876119 +0800 CST	failed	ingress-nginx-4.4.2	1.5.1
发现有一个ingress-nginx已经被创建,但是状态是失败的.

删除已经创建的服务信息.
[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$helm -n ingress-nginx delete ingress-nginx
release "ingress-nginx" uninstalled

重新查看命名空间下的信息,
[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$helm -n ingress-nginx ls -a
NAME	NAMESPACE	REVISION	UPDATED	STATUS	CHART	APP VERSION

发现已经被删除.
可以重新使用helm创建ingress-nginx.
[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$ls
CHANGELOG.md  changelog.md.gotmpl  Chart.yaml  ci  OWNERS  README.md  README.md.gotmpl  templates  values.yaml
[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$helm install ingress-nginx -n ingress-nginx .
这里是进入到values.yaml目录中进行安装操作.并等待安装过程.

9.安装结果如下

[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$helm install ingress-nginx -n ingress-nginx .
NAME: ingress-nginx
LAST DEPLOYED: Sun Oct  8 15:06:01 2023
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
Get the application URL by running these commands:
  export POD_NAME=$(kubectl --namespace ingress-nginx get pods -o jsonpath="{.items[0].metadata.name}" -l "app=ingress-nginx,component=controller,release=ingress-nginx")
  kubectl --namespace ingress-nginx port-forward $POD_NAME 8080:80
  echo "Visit http://127.0.0.1:8080 to access your application."

An example Ingress that makes use of the controller:
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: example
    namespace: foo
  spec:
    ingressClassName: nginx
    rules:
      - host: www.example.com
        http:
          paths:
            - pathType: Prefix
              backend:
                service:
                  name: exampleService
                  port:
                    number: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
      - hosts:
        - www.example.com
        secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

表示ingress-nginx安装完成.

查看相关信息

[root@leader /zpf/helm/ingress-nginx/ingress-nginx]$kubectl get po -n ingress-nginx
NAME                             READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-rgddv   1/1     Running   0          82s

安装完成后会在ingress-nginx命名空间下创建一个pod.这个pod就是ingress-nginx服务

创建ingress应用,创建

[root@leader /zpf/ingress]$vim wolfcode-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
  name: wolfcode-nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules: # ingress 规则配置,可以配置多个
  - host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
    http:
      paths: # 相当于 nginx 的 location 配置,可以配置多个
      - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准>
。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service:
            name: nginx-svc # 代理到哪个 service
            port:
              number: 80 # service 的端口
        path: /api # 等价于 nginx 中的 location 的路径前缀匹配

查看创建信息

[root@leader /zpf/ingress]$kubectl create -f wolfcode-ingress.yaml
ingress.networking.k8s.io/wolfcode-nginx-ingress created
[root@leader /zpf/ingress]$kubectl get ingress -A
NAMESPACE   NAME                     CLASS    HOSTS             ADDRESS        PORTS   AGE
default     wolfcode-nginx-ingress   <none>   k8s.wolfcode.cn   10.233.47.65   80      23s

configMap的使用

使用命令行创建configmap的,

这里是使用终端创建cm的示例.
[root@leader /zpf/configmap]$kubectl create cm -h
Examples:
  # Create a new config map named my-config based on folder bar
  kubectl create configmap my-config --from-file=path/to/bar

  # Create a new config map named my-config with specified keys instead of file basenames on disk
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt

  # Create a new config map named my-config with key1=config1 and key2=config2
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

  # Create a new config map named my-config from the key=value pairs in the file
  kubectl create configmap my-config --from-file=path/to/bar

  # Create a new config map named my-config from an env file
  kubectl create configmap my-config --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env

常用的创建方式是第二种.通过键值的配置文件来创建对应的configmap.用于集群内部的使用.

根据配置文件创建一个configmap

[root@leader /zpf/configmap]$pwd
/zpf/configmap
[root@leader /zpf/configmap]$cat conf.yml
dsn: 192.168.75.30
username: root
password: yaochizaoca

#创建一个基于conf.yml的configmap资源.
kubectl create configmap my-config --from-file=dbconf=./conf.yml
#查看创建好的cm资源
[root@leader /zpf/configmap]$kubectl get cm
NAME               DATA   AGE
db-config          1      10m
kube-root-ca.crt   1      12d
#根据configmap名称查看详细信息.
[root@leader /zpf/configmap]$kubectl describe cm db-config
Name:         db-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
dbconf:
----
dsn: 192.168.75.30
username: root
password: yaochizaocan


BinaryData
====

Events:  <none>

为cm创建别名.

[root@leader /zpf/configmap]$kubectl create configmap my-db-conf --from-file=dbconfig-alias=./conf.yml
configmap/my-db-conf created
[root@leader /zpf/configmap]$kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      12d
my-db-conf         1      4s
[root@leader /zpf/configmap]$kubectl describe cm my-db-conf
Name:         my-db-conf
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
dbconfig-alias:
----
dsn: 192.168.75.30
username: root
password: yaochizaocan


BinaryData
====

Events:  <none>
其中Data字段就是集群中使用的别名.

手动创建cm以键值的形式进行创建

kubectl create configmap test-env-config --from-literal=JAVA_OPTS_TEST='-Xms512m -Xmx512m' --from-literal=appname=sping_boot_test
表示创建一个 test-env-config的 cm
使用指定字段赋值的形式进行创建,
设置JAVA_OPTS_TEST='-Xms512m -Xmx512m'
设置appname=sping_boot_test

查看configmap信息

[root@leader /zpf/pods]$kubectl describe cm test-env-config
Name:         test-env-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
JAVA_OPTS_TEST:
----
-Xms512m -Xmx512m
appname:
----
sping_boot_test

BinaryData
====

Events:  <none>

创建一个pod调用configmap中的键值信息

[root@leader /zpf/pods]$cat conf-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-env-po
spec:
  restartPolicy: Never
  containers:
    - name: env-test
      image: alpine
      command: ["/bin/sh","-c","env;sleep 3600"]
      imagePullPolicy: IfNotPresent
      env:
      - name: JAVA_VM_OPTS
        valueFrom:
          configMapKeyRef:
            name: test-env-config
            key: JAVA_OPTS_TEST
      - name: APP
        valueFrom:
          configMapKeyRef:
            name: test-env-config
            key: appname
说明一下:JAVA_VM_OPTS 是容器内命名的环境变量名称.
valueFrom.configMapKeyRef: 表示获取方式是从configMap中获取.
获取的cm名称是: test-env-config 
cm中对应的键是JAVA_OPTS_TEST,
同理:获取其他的键值可以设置更多.

pod中使用:

容器启动后查看日志.可以看到,相关日志信息.其中可以看到,java相关的设置好的环境变量,代表pod内部获取cm的值成功.
[root@leader /zpf/pods]$kubectl logs -f test-env-po
KUBERNETES_PORT=tcp://10.233.0.1:443
NGINX_SVC_SERVICE_HOST=10.233.22.222
KUBERNETES_SERVICE_PORT=443
HOSTNAME=test-env-po
NGINX_SVC_EXTRENAL_SERVICE_HOST=10.233.35.62
SHLVL=1
HOME=/root
JAVA_VM_OPTS=-Xms512m -Xmx512m
NGINX_SVC_SERVICE_PORT=80
NGINX_SVC_PORT=tcp://10.233.22.222:80
NGINX_SVC_EXTRENAL_SERVICE_PORT=80
NGINX_SVC_EXTRENAL_PORT=tcp://10.233.35.62:80
NGINX_SVC_PORT_80_TCP_ADDR=10.233.22.222
APP=sping_boot_test
NGINX_SVC_PORT_80_TCP_PORT=80
NGINX_SVC_EXTRENAL_SERVICE_PORT_WEB=80
NGINX_SVC_EXTRENAL_PORT_80_TCP_ADDR=10.233.35.62
NGINX_SVC_PORT_80_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.233.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_SVC_EXTRENAL_PORT_80_TCP_PORT=80
NGINX_SVC_EXTRENAL_PORT_80_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
NGINX_SVC_PORT_80_TCP=tcp://10.233.22.222:80
NGINX_SVC_EXTRENAL_PORT_80_TCP=tcp://10.233.35.62:80
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.233.0.1:443
KUBERNETES_SERVICE_HOST=10.233.0.1
NGINX_SVC_SERVICE_PORT_HTTP=80
PWD=/

同样可以进入pod中查看相关环境变量也可以看到相同的内容.
[root@leader /zpf/pods]$kubectl exec -it test-env-po sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # env
KUBERNETES_SERVICE_PORT=443
NGINX_SVC_SERVICE_HOST=10.233.22.222
KUBERNETES_PORT=tcp://10.233.0.1:443
HOSTNAME=test-env-po
NGINX_SVC_EXTRENAL_SERVICE_HOST=10.233.35.62
SHLVL=1
HOME=/root
JAVA_VM_OPTS=-Xms512m -Xmx512m
NGINX_SVC_PORT=tcp://10.233.22.222:80
NGINX_SVC_SERVICE_PORT=80
NGINX_SVC_EXTRENAL_PORT=tcp://10.233.35.62:80
NGINX_SVC_EXTRENAL_SERVICE_PORT=80
NGINX_SVC_PORT_80_TCP_ADDR=10.233.22.222
APP=sping_boot_test
NGINX_SVC_EXTRENAL_SERVICE_PORT_WEB=80
NGINX_SVC_PORT_80_TCP_PORT=80
TERM=xterm
NGINX_SVC_PORT_80_TCP_PROTO=tcp
NGINX_SVC_EXTRENAL_PORT_80_TCP_ADDR=10.233.35.62
KUBERNETES_PORT_443_TCP_ADDR=10.233.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_SVC_EXTRENAL_PORT_80_TCP_PORT=80
KUBERNETES_PORT_443_TCP_PORT=443
NGINX_SVC_EXTRENAL_PORT_80_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PROTO=tcp
NGINX_SVC_PORT_80_TCP=tcp://10.233.22.222:80
NGINX_SVC_EXTRENAL_PORT_80_TCP=tcp://10.233.35.62:80
KUBERNETES_PORT_443_TCP=tcp://10.233.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
NGINX_SVC_SERVICE_PORT_HTTP=80
KUBERNETES_SERVICE_HOST=10.233.0.1
PWD=/

删除cm资源与删除其他资源一样.指定删除类型,指定资源名称即可

删除cm资源
[root@leader /zpf/configmap]$kubectl delete cm db-config
configmap "db-config" deleted

使用数据卷挂载configMap到容器中

首先如果已经加载完成configMap的话可以直接在pod的yaml文件中进行声明volumes

首先查看要挂载的cm以及相关信息.这里使用的是之前创建的my-db-conf

[root@leader /zpf/pods]$kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      13d
my-db-conf         1      3h36m
test-env-config    2      153m
[root@leader /zpf/pods]$kubectl describe cm my-db-conf
Name:         my-db-conf
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
dbconfig-alias:
----
dsn: 192.168.75.30
username: root
password: yaochizaocan


BinaryData
====

Events:  <none>

书写pod文件(这里使用pod举例,可以使用deploy,stsfulset等使用方法相同).

[root@leader /zpf/pods]$cat file-test-pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: test-configfile-po
spec:
  restartPolicy: Never
  containers:
    - name: env-test
      image: alpine
      command: ["/bin/sh","-c","env;sleep 3600"]
      imagePullPolicy: IfNotPresent
      volumeMounts: #加载数据卷
        - name: db-config #表示加载volumes中的哪个数据卷,这里定义的是name:db-config对应的卷内容
          mountPath: "/usr/local/mysql/conf" #将数据卷中的文件加载到哪一个目录中.
          readOnly: true #设置是否只读
  volumes: #以数据卷的形式挂载configmap secret等
  - name: db-config #数据卷名称,随意设置.
    configMap:  #指定数据卷类型为configmap
      name: my-db-conf  #这里指定cm的名称,必须要与cm中的cm一致.
      items: #对configMap中的key进行映射,如果不指定默认会讲configmap中所有key全部转换成一个同名文件.
      - key: "dbconfig-alias" #configMap中的key.
        path: "dbconfig-alias" #将该key转换成文件.
  restartPolicy: Never #重启策略,从不重启

    configMap: 
      name: my-db-conf  
      items: #对configMap中的key进行映射,如果不指定默认会讲configmap中所有key全部转换成一个同名文件.
      - key: "dbconfig-alias" #configMap中的key.这里说明一下.这里的名称是指cm中的某一类k/v的集合.多个kv根据这个名称整合成一个文件.然后重命名为dbconfig-alias,这个名称可写可不写.
        path: "dbconfig-alias" #将该key转换成文件.

创建使用secret,

一般的使用场景之一是不同的项目通过不同的镜像仓库进行拉取操作.

#创建镜像仓库使用的secret相关信息.
[root@leader /zpf/pods]$ kubectl create secret docker-registry harbor-secret --docker-server=k8s.wolfcode.cn --docker-username=admin --docker-password=yaochizaocan --docker-email=348264747@qqq.com
secret/harbor-secret created

#查看secret是否创建成功,这里已经创建成功,
[root@leader /zpf/pods]$kubectl get secret
NAME                                         TYPE                                  DATA   AGE
ack-ingress-nginx-v1-admission-token-cwxnn   kubernetes.io/service-account-token   3      47h
default-token-h6f9g                          kubernetes.io/service-account-token   3      13d
harbor-secret                                kubernetes.io/dockerconfigjson        1      8s
sh.helm.release.v1.ack-ingress-nginx-v1.v1   helm.sh/release.v1                    1      47h

#查看指定secret的详细信息,因为secret是经过base64编码后的,所以这里不显示相关信息.但是可以看到,一个138字节大小的文件.
[root@leader /zpf/pods]$kubectl describe secret harbor-secret
Name:         harbor-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/dockerconfigjson

Data
====
.dockerconfigjson:  138 bytes
#查看编码的详细信息可以使用edit进行编辑没然后就可以看到secret的详细信息.
[root@leader /zpf/pods]$kubectl edit secret harbor-secret
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJrOHMud29sZmNvZGUuY24iOnsidXNlcm5hbWUiOiJhZG1pbiIsInBhc3N3b3JkIjoieWFvY2hpemFvY2FuIiwiZW1haWwiOiIzNDgyNjQ3NDdA
cXFxLmNvbSIsImF1dGgiOiJZV1J0YVc0NmVXRnZZMmhwZW1GdlkyRnUifX19
kind: Secret
metadata:
  creationTimestamp: "2023-10-09T11:04:45Z"
  name: harbor-secret
  namespace: default
  resourceVersion: "403022"
  uid: 153efefe-2e1b-4dad-ae39-f6999fd5bccc
type: kubernetes.io/dockerconfigjson

然后登陆指定的景象仓库后就可以拉取对应的容器镜像.

[root@leader ~]$docker login --username=3482****@qq.com registry.cn-beijing.aliyuncs.com
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@leader ~/.docker]$docker pull registry.cn-beijing.aliyuncs.com/scorpio/golang:1.19
1.19: Pulling from scorpio/golang
bba7bb10d5ba: Pulling fs layer
ec2b820b8e87: Downloading [>                                                  ]    241kB/24.03MB
284f2345db05: Pulling fs layer
67f4091d98ee: Waiting
709ad19cc080: Waiting
62b1fd90321b: Waiting

如果在创建pod等资源类型的文件中指定已经创建好的secret-registry信息,那么就不需要在master宿主机上再次登陆对应的镜像仓库.例如:

[root@leader /zpf/pods]$cat ali-registry-test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ali-pull-inage-test
spec:
  restartPolicy: Never
  imagePullSecrets:  #这里指定拉取容器镜像的方式是读取secret.
  - name: aliyun-registry  #指定regist名称,这里已经根据用户名,密码,拉取地址,个人邮箱等信息,创建好了secret,那么在创建本pod的时候就不需要在master节点上再次登陆该仓库就可以直接拉取.信息都存在secret中,
  containers:
    - name: env-test
      image: registry.cn-beijing.aliyuncs.com/scorpio/golang:1.19
      command: ["/bin/sh","-c","env;sleep 3600"]
      imagePullPolicy: IfNotPresent
      volumeMounts: #加载数据卷
        - name: db-config #表示加载volumes中的哪个数据卷,这里定义的是name:db-config对应的卷内容
          mountPath: "/usr/local/mysql/conf" #将数据卷中的文件加载到哪一个目录中.
          readOnly: true #设置是否只读
  volumes: #以数据卷的形式挂载configmap secret等
  - name: db-config #数据卷名称,随意设置.
    configMap:  #指定数据卷类型为configmap
      name: my-db-conf  #这里指定cm的名称,必须要与cm中的cm一致.
      items: #对configMap中的key进行映射,如果不指定默认会讲configmap中所有key全部转换成一个同名文件.
      - key: "dbconfig-alias" #configMap中的key.
        path: "dbconfig-alias" #将该key转换成文件.
  restartPolicy: Never #重启策略,从不重启

spec:
  restartPolicy: Never
  imagePullSecrets:  #这里指定拉取容器镜像的方式是读取secret.
  - name: aliyun-registry  #指定regist名称,这里已经根据用户名,密码,拉取地址,个人邮箱等信息,创建好了secret,那么在创建本pod的时候就不需要在master节点上再次登陆该仓库就可以直接拉取.信息都存在secret中,

使用subPath的使用

将configMap中的资源挂载到deployment中使用相关配置.

#根据现有的nginx配置文件创建一个configMap,
kubectl create cm nginx-conf-cm --from-file=./nginx.conf
#查看创建好的configmap中的内容.
[root@leader /zpf/deployment]$kubectl describe cm nginx-conf-cm
Name:         nginx-conf-cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx.conf:
----
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


BinaryData
====

Events:  <none>
#创建一个用于挂载configMap的deployment,
[root@leader /zpf/deployment]$cat sub-test.yaml
apiVersion: apps/v1   #deploy api版本
kind: Deployment  #资源类型为deployment
metadata:  #原数据标签
  labels: #标签
    app: nginx-deploy   #这里是deploy的label标签用来与后面的rs与pod进行关联
  name: nginx-deploy  #deployment 名字
  namespace: default  #默认命名空间
spec:  #
  replicas: 1 #期望副本数
  revisionHistoryLimit: 10  #进行滚动更新后,保留的历史版本数量
  selector:  #选择器,用于找到匹配的RS
    matchLabels:  #按照标签匹配
      app: nginx-deploy  #在deploy中关联rs的字段使用的就是selector
  strategy:
    rollingUpdate:  #滚动更新配置
      maxSurge: 25% #表示在更新的时候可以有25%额外的pod出现.超过期望副本数的比例是25%
      maxUnavailable: 25%  #最多可以允许25%的pod在更新时处于不可用状态.
    type: RollingUpdate  #更新类型,指定为滚动更新
  template:  #pod模板,
    metadata: #pod原数据信息
      labels: #pod标签
        app: nginx-deploy  #这里是rs与pod之间的关联字段
    spec:  #pod期望信息
      containers:  #破的容器相关信息
      - image: nginx:1.7.9  #pod使用的镜像版本
        imagePullPolicy: IfNotPresent  #pod镜像拉取策略
        name: nginx  #pod名称
        resources:
          limits:
            cpu: 100m
            memory: 128Mi
          requests:
            cpu: 100m
            memory: 128Mi
        volumeMounts:
        - mountPath: /etc/nginx/nginx.conf
          name: nginx-config
          subPath: etc/nginx/nginx.conf
      restartPolicy: Always  #重启策略
      terminationGracePeriodSeconds: 30 #宽限时间
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-conf-cm
          items:
          - key: nginx.conf
            path: etc/nginx/nginx.conf

说明一下.这里声明的volumesMount挂载时为了不将原目录下的文件清除,使用的是subPath.

并且书写路径不能从/开始进行书写.

另外书写的时候遇到的一个坑,在使用configMap的时候没有注意缩进.导致yaml文件异常报错.

最终在deploy内部的pod中查看文件是否已经加载到了对应的目录中.

[root@leader /zpf/deployment]$kubectl exec -it nginx-deploy-868d9668cb-bzmgd sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cd /etc/nginx/
# ls
conf.d	fastcgi_params	koi-utf  koi-win  mime.types  nginx.conf  scgi_params  uwsgi_params  win-utf
这里看到文件已经被加载到了破的中.

k8sKubernetes基础知识点通俗易懂的解释如下: Kubernetes是一种容器编排平台,用于管理和部署容器化应用程序。它提供了一种简单而强大的方式来自动化应用的调度、扩展和管理,使开发人员和运维人员能够以更高效的方式管理容器化应用。 在学习k8s基础知识之前,建议您具备一定的Linux基础和网络基础知识,并了解一些Docker和k8s相关的概念。例如,您可以先掌握一些关于容器的基本概念,比如什么是容器容器镜像、容器编排等。此外,您还需要了解一些关于k8s的核心概念,比如Pod、Service、Deployment等。 Kubernetes中的Pod是最小的部署单元,它包含一个或多个容器,并共享存储、网络等资源。Pod可以被创建、启动、停止或调度,以确保容器应用程序的高可用性和弹性。 Service是一种抽象,用于将一组Pod暴露给其他应用程序或用户。它为Pod提供了一个稳定的网络地址,并负责负载均衡请求。 Deployment是一种资源对象,它定义了如何部署应用程序。通过Deployment,您可以指定要运行的Pod数量、容器的镜像、升级策略等。 除此之外,还有许多其他的k8s核心概念和功能,如Namespace、ReplicaSet、StatefulSet等,它们可以帮助您更好地管理和扩展容器化应用程序。 总之,k8s基础知识点涉及到了容器编排、Pod、Service、Deployment等核心概念。通过学习这些知识,您将能够更好地理解和使用Kubernetes平台来管理和部署容器化应用程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Prometheus+Grafana(Kubernetes)企业级监控](https://download.csdn.net/download/weixin_26833205/19732967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [云计算虚拟化:k8s进阶-CRD开发基础](https://blog.csdn.net/dustzhu/article/details/112029190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [视频教程-通俗易懂的消息中间件ActiveMQ教程(含配套资料)-Docker/K8S](https://blog.csdn.net/weixin_33500227/article/details/106513277)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值