一.configmap
1.概述
configmap资源,简称cm资源,它生成的键值对数据,存储在etcd数据库中
应用场景:主要是对应用程序的配置
pod通过env变量引入configmap,或者通过数据卷挂载volume的方式引入configmap资源
官方解释:
configmap 卷提供了向 pod 注入配置数据的方法。 configmap 对象中存储的数据可以被 configmap 类型的卷引用,然后被 pod 中运行的容器化应用使用。
引用 configmap 对象时,你可以在卷中通过它的名称来引用。 你可以自定义 configmap 中特定条目所要使用的路径。 下面的配置显示了如何将名为 log-config 的 configmap 挂载到名为 configmap-pod 的 pod 中
2.查看k8s集群系统中都有哪些资源类型
[root@master demo]# kubectl api-resources
3.configmap资源管理
· 创建工作目录
[root@master demo]# mkdir configmap
[root@master demo]# cd configmap
· 创建configmap资源
1.声明式创建configmap资源
· 编辑configmap资源清单
[root@master a]# cat 01-cm.yaml
apiversion: v1
kind: configmap
metadata:
name: cm01
#声明cm资源的数据
data:
#第一种写法【key:value】
demo: demo-cm
k8s: kubernets
#第二种写法【key:| value value value...】
test: |
a=a
b=b
c=c
· 创建查看configmap资源
[root@master a]# kubectl apply -f 01-cm.yaml
configmap/cm01 created
[root@master a]# kubectl get cm cm01
name data age
cm01 3 15s
2.响应式创建configmap资源
· 命令行创建configmap资源
[root@master a]# kubectl create cm cm02 --from-literal=test=111 --from-literal=d=ddd
configmap/cm02 created
· 查看cm资源
[root@master a]# kubectl get cm cm02
name data age
cm02 2 14s
3.指定文件方式创建cm资源
· 编辑一个文件
[root@master a]# cat > 1.txt <<eof
> aaaa
> bbbb
> cccc
> dddd
> 1111
> 2222
> 3333
> 4444
> eof
·创建查看configmap资源
[root@master a]# kubectl create cm cm03 --from-file=1.txt=1.txt
configmap/cm03 created
[root@master a]# kubectl get cm cm03
name data age
cm03 1 8s
4.查看cm资源的详细信息
[root@master a]# kubectl describe cm cm03
name: cm03
namespace: default
labels: <none>
annotations: <none>
data
====
1.txt:
----
aaaa
bbbb
cccc
dddd
1111
2222
3333
4444
binarydata
====
events: <none>
5.删除cm资源
[root@master a]# kubectl delete cm --all
configmap "cm01" deleted
configmap "cm02" deleted
configmap "cm03" deleted
configmap "kube-root-ca.crt" deleted
4.pod引入cm资源
pod引入cm资源的方式,有两种,env变量引入和volume挂载卷引入
·env变量引入
1.编辑并创建cm资源
[root@master a]# cat 01-cm.yaml
apiversion: v1
kind: configmap
metadata:
name: cm01
#声明cm资源的数据
data:
#第一种写法【key:value】
demo: demo-cm
k8s: kubernets
#第二种写法【key:| value value value。。。】
test: |
a=a
b=b
c=c
[root@master a]# kubectl apply -f 01-cm.yaml
configmap/cm01 created
2.创建pod资源,env变量引入cm
[root@master a]# cat pod-env.yaml
apiversion: v1
kind: pod
metadata:
name: demo111
spec:
containers:
- name: demo-e
image: nginx:1.20.1-alpine
env:
#引入一个变量
- name: env-cm01
#从其他位置引入变量
valuefrom:
#声明从configmap中引入变量
configmapkeyref:
#引入变量configmap的名称
name: cm01
key: demo
#引入第二个变量
- name: env-cm02
valuefrom:
configmapkeyref:
name: cm01
#引用configmap中的哪个key
key: test
[root@master a]# kubectl apply -f pod-env.yaml
pod/demo111 created
[root@master a]# kubectl get pods
name ready status restarts age
demo 1/1 running 1 (48m ago) 52m
demo111 1/1 running 0 9s
3.进入容器查看变量是否引入成功
[root@master a]# kubectl exec demo111 -it -- sh
/ # env
· volume挂载卷引入cm
1.编辑pod资源清单
[root@master a]# cat pod-env.yaml
apiversion: v1
kind: pod
metadata:
name: demo111
spec:
#声明pod存储卷
volumes:
- name: vol-cm
#声明挂载cm资源
configmap:
#指定cm组员名称
name: cm01
#如果不写items,则引用cm资源中全部的key:value作为文件挂载
items:
#cm资源的key是什么
- key: demo
#key的value值挂载到容器中变成文件内容,文件名叫什么
path: demo.txt
- key: test
path: test.txt
containers:
- name: demo-d
image: nginx:1.20.1-alpine
volumemounts:
- name: vol-cm
mountpath: /demo
2.创建查看资源
[root@master a]# kubectl apply -f pod-env.yaml
pod/demo111 created
[root@master a]# kubectl get pods
name ready status restarts age
demo111 1/1 running 0 35s
3. 进入pod容器查看是否挂载成功,变成文件
[root@master a]# kubectl exec demo111 -it -- sh
/ # ls
bin docker-entrypoint.sh media root sys
demo etc mnt run tmp
dev home opt sbin usr
docker-entrypoint.d lib proc srv var
/ # cd demo
/demo # ls
demo.txt test.txt
/demo # cat demo.txt
demo-cm
/demo # cat test.txt
a=a
b=b
c=c
注:当pod挂载cm资源到容器的目录后,若容器的原目录中有文件,则会被清空,那么如何做到,及把cm资源挂载成为文件到容器的指定目录,又能保证容器原目录中的文件不清空呐?
subpath
[root@master a]# cat pod-env.yaml
apiversion: v1
kind: pod
metadata:
name: demo111
spec:
volumes:
- name: vol-cm
configmap:
name: cm01
items:
- key: demo
path: demo.txt
- key: test
path: test.txt
containers:
- name: demo-d
image: nginx:1.20.1-alpine
volumemounts:
- name: vol-cm
mountpath: /demo
#如果subpath不指定任何值(默认),则默认容器挂载路径为空,表示清空挂载点;
#如果subpath指定名称和cm的path相同,表示仅仅挂载这个文件,不清空挂在的目录保留原本容器路径的文件;
#也就是说volumes>>configmap>items>path只有与subpath的值相等时,才是挂载文件;否则就是挂载目录;会清空目录;
subpath: test
#resdonly: true #只读设置;表示不允许容器内编辑或删除这个文件;
二.secrets
secrets资源,类似于configmap资源,只是secrets资源是用来传递重要的信息的;
secret資源就是將value的值使用base64编译后传输,当pod引用secret后,k8s会自动将其base64的编码,反编译回正常的字符串;
官方解释:
secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 pod 规约中或者镜像中。 使用 secret 意味着你不需要在应用程序代码中包含机密数据。
由于创建 secret 可以独立于使用它们的 pod, 因此在创建、查看和编辑 pod 的工作流程中暴露 secret(及其数据)的风险较小。 kubernetes 和在集群中运行的应用程序也可以对 secret 采取额外的预防措施, 例如避免将敏感数据写入非易失性存储。
1.创建secrets资源
·准备将“想要的数据”使用base64进行编码
#正向编码
[root@worker2 ~]# echo demotest | base64
zgvtb3rlc3qk
[root@worker2 ~]# echo kubernets | base64
a3vizxjuzxrzcg==
#反向编码
[root@worker2 ~]# echo zgvtb3rlc3qk | base64 -d
demotest
·声明式创建secrets资源
1.编辑secrets资源清单
[root@master secrets]# cat 01-secret.yaml
apiversion: v1
kind: secret
metadata:
name: demo1
#用户自定义的类型(opaque为自定义类型)
type: opaque
data:
demotest: zgvtb3rlc3qk
kubernets: a3vizxjuzxrzcg==
2.创建查看secret资源
[root@master secrets]# kubectl apply -f .
secret/demo1 created
[root@master secrets]# kubectl get secrets
name type data age
default-token-rnwqs kubernetes.io/service-account-token 3 9d
demo1 opaque 2 2m40s
·响应式创建secret
[root@master secrets]# kubectl create secret generic demo2 --from-literal=testa=dgvzdgek --from-literal=testb=dgvzdgik
查看secrets资源
[root@master secrets]# kubectl get secrets
name type data age
default-token-rnwqs kubernetes.io/service-account-token 3 9d
demo1 opaque 2 2m40s
demo2 opaque 2 15s
2.pod引用secret资源
· pod资源env环境变量引用secret资源
1.编辑pod资源
[root@master secrets]# cat 01-pod.yaml
apiversion: v1
kind: pod
metadata:
name: demo323
spec:
containers:
- name: nginx-d
image: nginx:1.20.1-alpine
env:
- name: secret-env01
valuefrom:
#声明引用sercet
secretkeyref:
#声明secret名称
name: demo1
#声明secret的key
key: demotest
- name: secret-env02
valuefrom:
secretkeyref:
name: demo1
key: kubernets
2.创建查看pod
[root@master secrets]# kubectl apply -f 01-pod.yaml
pod/demo323 created
[root@master secrets]# kubectl get pods -o wide
name ready status restarts age ip node nominated node readiness gates
demo323 1/1 running 0 13s 10.100.1.35 worker1 <none> <none>
3.登录pod资源查看env变量
[root@master secrets]# kubectl exec demo323 -it -- sh
/ # env
· pod资源volume存储卷引用secret资源
1.编辑pod资源
[root@master secrets]# cat 01-pod.yaml
apiversion: v1
kind: pod
metadata:
name: demo333
spec:
volumes:
- name: vol-secret
secret:
secretname: demo1
containers:
- name: nginx-d
image: nginx:1.20.1-alpine
volumemounts:
- name: vol-secret
mountpath: /demos
2.创建查看pod
[root@master secrets]# kubectl apply -f 01-pod.yaml
pod/demo333 created
[root@master secrets]# kubectl get pods -o wide
name ready status restarts age ip node nominated node readiness gates
demo333 1/1 running 0 11s 10.100.1.36 worker1 <none> <none>
3.进入容器内查看是否挂在为文件
[root@master secrets]# kubectl exec demo333 -it -- sh
/ # ls
bin docker-entrypoint.sh media root sys
demos etc mnt run tmp
dev home opt sbin usr
docker-entrypoint.d lib proc srv var
/ # cd demos
/demos # ls
demotest kubernets
/demos # cat demotest
demotest
/demos # cat kubernets
kubernets
3.secret类型之-私有镜像仓库使用
创建docker harbor的secret信息:
因为,k8s拉取镜像与docker拉取镜像是不同的方式,所以k8s需要创建一个属于自己的拉取镜像的方式
·harbor创建私有仓库
harbor创建私有仓库
· 推送镜像到私有仓库
[root@worker2 ~]# docker login -uadmin -p111aaa.. harbor.test.com
[root@worker2 ~]# docker tag nginx:1.20.1-alpine harbor.test.com/demo/nginx:1.20.1-alpine
[root@worker2 ~]# docker push harbor.test.com/demo/nginx:1.20.1-alpine
the push refers to repository [harbor.test.com/demo/nginx]
9d5b000ce7c7: pushed
b8dbe22b95f7: pushed
c39c1c35e3e8: pushed
5f66747c8a72: pushed
15d7cdc64789: pushed
7fcb75871b21: pushed
1.20.1-alpine: digest: sha256:34c4a6f3b4d5e5f886bfa6a32642ecf023282c82c03d37901bc1f30823abbd5d size: 1568
· 创建拉取镜像的secret资源
1.响应式创建secret资源
[root@master secrets]# kubectl create secret docker-registry demo-harbor --docker-username=admin --docker-password=111aaa.. --docker-email=123@qq.com --docker-server=harbor.test.com
[root@master secrets]# kubectl get secret
name type data age
default-token-rnwqs kubernetes.io/service-account-token 3 9d
demo-harbor kubernetes.io/dockerconfigjson 1 11s
· 创建pod引用拉取镜像的secret资源
[root@master secrets]# cat 01-pod.yaml
apiversion: v1
kind: pod
metadata:
name: demo-harbor00
spec:
imagepullsecrets:
- name: demo-harbor
containers:
- name: harbortest
image: harbor.test.com/demo/nginx:1.20.1-alpine
[root@master secrets]# kubectl apply -f 01-pod.yaml
pod/demo-harbor00 created
[root@master secrets]# kubectl get pods -o wide
name ready status restarts age ip node nominated node readiness gates
demo-harbor00 1/1 running 0 14s 10.100.1.37 worker1 <none> <none>
三.静态pod
pod创建流程
1.查看静态pod的路径
[root@master ~]# vim /var/lib/kubelet/config.yaml
......
staticpodpath: /etc/kubernetes/manifests
2.静态pod的查看与含义
这里面的名称都是我们的k8s集群中master节点的组成组件
[root@master secrets]# ll /etc/kubernetes/manifests/
总用量 16
-rw------- 1 root root 2274 7月 5 14:44 etcd.yaml
-rw------- 1 root root 3403 7月 10 20:26 kube-apiserver.yaml
-rw------- 1 root root 2880 7月 5 14:44 kube-controller-manager.yaml
-rw------- 1 root root 1465 7月 5 14:44 kube-scheduler.yaml
静态pod就是kubelet自己监视的目录,如果这个目录有pod资源清单,则会在当前节点自动创建pod;不需要手动kubectl apply -f xxx.yaml
静态pod的创建,只在当前节点上创建,pod的名称会自动给你加一个当前节点名称后缀;
静态pod,只要有yaml文件在这个目录,就无法删除;
· 示例
[root@master pod]# mv 01-pod-nginx.yaml /etc/kubernetes/manifests/
[root@master pod]# kubectl get pods -o wide
name ready status restarts age ip node nominated node readiness gates
m-nginx-master 0/1 containercreating 0 9s <none> master <none> <none>
发表评论