-
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 这里看到文件已经被加载到了破的中.