番禺龙美村做网站,怎样开一个小外贸公司,建材有限公司光速东莞网站建设,电子商务平台怎么注册一.Secret 实现
1.1 secret 详解 secret用来保存小片敏感数据的k8s资源#xff0c;例如密码#xff0c;token#xff0c;或者秘钥。这类数据当然也可以存放在Pod或者镜像中#xff0c;但是放在Secret中是为了更方便的控制如何使用数据#xff0c;并减少暴露的风险。 …一.Secret 实现
1.1 secret 详解 secret用来保存小片敏感数据的k8s资源例如密码token或者秘钥。这类数据当然也可以存放在Pod或者镜像中但是放在Secret中是为了更方便的控制如何使用数据并减少暴露的风险。 用户可以创建自己的secret系统也会有自己的secret。 Pod需要先引用才能使用某个secret Pod使用secret方式 作为volume的一个域被一个或多个容器挂载 內建的Secrets: 由ServiceAccount创建的API证书附加的秘钥k8s自动生成的用来访问apiserver的Secret所有Pod会默认使用这个Secret与apiserver通信 创建自己的Secret: 方式1使用kubectl create secret命令 方式2yaml文件创建Secret 1.2 secret 使用
创建Secret
假如某个Pod要访问数据库需要用户名密码现在我们分别设置这个用户名和密码 Secret 对象要求这些数据必须是经过 Base64 转码的以免出现明文密码显示的安全隐患。
# 创建一个secret.yaml文件内容用base64编码:明文显示容易被别人发现这里先转码。
[rootkub-k8s-master ~]# echo -n admin | base64
YWRtaW4
[rootkub-k8s-master ~]# echo -n 1f2d1e2e67df | base64
MWYyZDFlMmU2N2Rm
创建一个secret.yaml文件内容用base64编码
[rootkub-k8s-master prome]# vim secret.yml
---
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque #模糊
data:username: YWRtaW4password: MWYyZDFlMmU2N2Rm
创建
[rootkub-k8s-master prome]# kubectl apply -f secret.yml
secret/mysecret created
解析Secret中内容,还是经过编码的---需要解码
# 查看secret
[rootkub-k8s-master ~]# kubectl get secrets
NAME TYPE DATA AGE
default-token-7vc82 kubernetes.io/service-account-token 3 30h
mysecret Opaque 2 6s# 查看secret详细信息
[rootkub-k8s-master prome]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:password: MWYyZDFlMmU2N2Rmusername: YWRtaW4
kind: Secret
metadata:creationTimestamp: 2023-10-21T03:07:56Zname: mysecretnamespace: defaultresourceVersion: 162855selfLink: /api/v1/namespaces/default/secrets/mysecretuid: 36bcd07d-92eb-4755-ac0a-a5843ed986dd
type: Opaque
手动base64解码方式:
[rootkub-k8s-master ~]# echo MWYyZDFlMmU2N2Rm | base64 --decode
1.3 使用Secret secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用也可以被系统中的其他资源使用。 一个Pod中引用Secret的列子 创建一个Secret多个Pod可以引用同一个Secret 修改Pod的定义在spec.volumes[]加一个volume给这个volume起个名字spec.volumes[].secret.secretName记录的是要引用的Secret名字 [rootkub-k8s-master prome]# vim pod_use_secret.yaml
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: testredisimage: daocloud.io/library/redisvolumeMounts: #挂载一个卷- name: foo #这个名字需要与定义的卷的名字一致mountPath: /etc/foo #挂载到容器里哪个目录下随便写readOnly: truevolumes: #数据卷的定义- name: foo #卷的名字这个名字自定义secret: #卷是直接使用的secret。secretName: mysecret #调用刚才定义的secret创建
[rootkub-k8s-master prome]# kubectl apply -f pod_use_secret.yaml
pod/mypod created
[rootkub-k8s-master prome]# kubectl exec -it mypod /bin/bash
rootmypod:/data# cd /etc/foo/
rootmypod:/etc/foo# ls
password username
rootmypod:/etc/foo# cat password
1f2d1e2e67df 结果中看到保存在 Etcd 里的用户名和密码信息已经以文件的形式出现在了容器的 Volume 目录里。 而这个文件的名字就是 kubectl create secret 指定的 Key或者说是 Secret 对象的 data 字段指定的 Key。 每一个被引用的Secret都要在spec.volumes中定义 如果Pod中的多个容器都要引用这个Secret那么每一个容器定义中都要指定自己的volumeMounts但是Pod定义中声明一次spec.volumes就好了。 映射secret key到指定的路径
可以控制secret key被映射到容器内的路径利用spec.volumes[].secret.items来修改被映射的具体路径
[rootkub-k8s-master prome]# kubectl delete -f pod_use_secret.yaml
pod mypod deleted
[rootkub-k8s-master prome]# vim pod_use_secret.yaml
---
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: testredisimage: daocloud.io/library/redisvolumeMounts:- name: foomountPath: /etc/fooreadOnly: truevolumes:- name: foosecret:secretName: mysecretitems: #定义一个items- key: username #将那个key重新定义到那个目录下path: my-group/my-username #相对路径相对于/etc/foo的路径2.创建
[rootkub-k8s-master prome]# kubectl apply -f pod_use_secret.yaml
pod/mypod created
3.从volume中读取secret的值
[rootkub-k8s-master prome]# kubectl exec -it mypod /bin/bash
rootmypod:/data# cd /etc/foo/my-group
rootmypod:/etc/foo/my-group# ls
my-username
rootmypod:/etc/foo/my-group# cat my-username
admin
rootmypod:/etc/foo/my-group#
username被映射到了文件/etc/foo/my-group/my-username而不是/etc/foo/username,而password没有被使用,这种方式每个key的调用需要单独用key像username一样调用
被挂载的secret内容自动更新
也就是如果修改一个Secret的内容那么挂载了该Secret的容器中也将会取到更新后的值但是这个时间间隔是由kubelet的同步时间决定的。
1.设置base64加密
[rootkub-k8s-master prome]# echo mahong | base64
bWFob25n
2.将admin替换成mahong
[rootkub-k8s-master prome]# vim secret.yml
---
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: bWFob25n #修改为mahong的base64加密后的password: MWYyZDFlMmU2N2Rm1.创建
[rootkub-k8s-master prome]# kubectl apply -f secret.yml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
secret/mysecret configured
2.连接pod容器
[rootkub-k8s-master prome]# kubectl exec -it mypod /bin/bash
rootmypod:/data# cd /etc/foo/my-group
rootmypod:/etc/foo/my-group# ls
my-username
rootmypod:/etc/foo/my-group# cat my-username
mahong 以环境变量的形式使用Secret
[rootkub-k8s-master prome]# kubectl delete -f pod_use_secret.yaml
pod mypod deleted
[rootkub-k8s-master prome]# vim pod_use_secret.yaml
---
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: testredisimage: daocloud.io/library/redisenv: #定义环境变量- name: SECRET_USERNAME #创建新的环境变量名称valueFrom:secretKeyRef: #调用的key是什么name: mysecret #变量的值来自于mysecretkey: username #username里面的值2.创建使用secret的pod容器
[rootkub-k8s-master prome]# kubectl apply -f pod_use_secret.yaml
pod/mypod created
3.连接
[rootkub-k8s-master prome]# kubectl exec -it mypod /bin/bash
rootmypod:/data# echo $SECRET_USERNAME #打印一下定义的变量
mahong 1.4 实战案例
1.创建数据库用户的密码secret
[rootkub-k8s-master test]# echo -n Mawenbao123 | base64
TWF3ZW5iYW9AMTIz
[rootkub-k8s-master test]# cat secret.yml
apiVersion: v1
kind: Secret
metadata:name: mysql-secret
type: Opaque
data:password: TWF3ZW5iYW9AMTIz[rootkub-k8s-master test]# kubectl apply -f secret.yml2.创建数据库并使用secret
[rootkub-k8s-master test]# cat mysql.yaml
apiVersion: v1
kind: Pod
metadata:name: my-mysql
spec:containers:- name: mysqlimage: daocloud.io/library/mysql:5.7ports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: password
[rootkub-k8s-master test]# kubectl apply -f myslq.yaml
[rootkub-k8s-master test]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-mysql 1/1 Running 0 2m47s 10.244.2.13 node2 none none测试:
[rootkub-k8s-master test]# mysql -uroot -pMawenbao123 -h 10.244.2.13 -P3306
二.ConfigMap详解 ConfigMap与 Secret 类似用来存储配置文件的kubernetes资源对象所有的配置内容都存储在etcd中。 与 Secret 的区别 ConfigMap 保存的是不需要加密的、应用所需的配置信息。 ConfigMap 的用法几乎与 Secret 完全相同可以使用 kubectl create configmap 从文件或者目录创建 ConfigMap也可以直接编写 ConfigMap 对象的 YAML 文件。 2.1 创建ConfigMap的方式 创建ConfigMap的方式有4种 命令行方式 方式1通过直接在命令行中指定configmap参数创建即--from-literal 方式2通过指定文件创建即将一个配置文件创建为一个ConfigMap--from-file文件 方式3通过指定目录创建即将一个目录下的所有配置文件创建为一个ConfigMap--from-file目录 配置文件方式 方式4事先写好标准的configmap的yaml文件然后kubectl create -f 创建 2.2 通过命令行参数创建
创建命令
[rootkub-k8s-master prome]# kubectl create configmap test-configmap --from-literaluseradmin --from-literalpass1122334
configmap/test-configmap created 结果如下面的data内容所示
[rootkub-k8s-master prome]# kubectl get configmap test-configmap -o yaml
apiVersion: v1
data:pass: 1122334user: admin
kind: ConfigMap
metadata:creationTimestamp: 2019-10-21T07:48:15Zname: test-configmapnamespace: defaultresourceVersion: 187590selfLink: /api/v1/namespaces/default/configmaps/test-configmapuid: 62a8a0d0-fab9-4159-86f4-a06aa213f4b1
2.3 通过指定文件创建
编辑文件server.conf内容如下
[rootkub-k8s-master prome]# vim server.conf
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
}
创建可以有多个--from-file
[rootkub-k8s-master prome]# kubectl create configmap test-config2 --from-fileserver.conf
configmap/test-config2 created
结果如下面data内容所示
[rootkub-k8s-master prome]# kubectl get configmap test-config2 -o yaml
apiVersion: v1
data:server.conf: |server {listen 80;server_name localhost;localtion / {root /var/www/html;index index.html index.htm;}}
kind: ConfigMap
metadata:creationTimestamp: 2023-10-21T08:01:43Zname: test-config2namespace: defaultresourceVersion: 188765selfLink: /api/v1/namespaces/default/configmaps/test-config2uid: 790fca12-3900-4bf3-a017-5af1070792e5
通过指定文件创建时configmap会创建一个key/value对key是文件名value是文件内容。
2.4 指定目录创建
configs 目录下的config-1和config-2内容如下所示
[rootkub-k8s-master prome]# mkdir config
[rootkub-k8s-master prome]# cd config/
[rootkub-k8s-master config]# vim config1
aaa
bbb
cd
[rootkub-k8s-master config]# vim config2
eee
fff
hk 创建
[rootkub-k8s-master config]# cd ..
[rootkub-k8s-master prome]# kubectl create configmap test-config3 --from-file./config
configmap/test-config3 created 结果下面data内容所示
[rootkub-k8s-master prome]# kubectl get configmap test-config3 -o yaml
apiVersion: v1
data:config1: |aaabbbcdconfig2: |eeefffhk
kind: ConfigMap
metadata:creationTimestamp: 2023-10-21T08:20:42Zname: test-config3namespace: defaultresourceVersion: 190420selfLink: /api/v1/namespaces/default/configmaps/test-config3uid: 6e00fded-80a8-4297-aeb3-4c48795e6eb9
指定目录创建时configmap内容中的各个文件会创建一个key/value对key是文件名value是文件内容。
2.5 通过yaml文件创建
yaml文件内容如下 注意其中一个key的value有多行内容时的写法
[rootkub-k8s-master prome]# vim configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:name: test-config4namespace: default
data:cache_host: memcached-gcxtcache_port: 11211cache_prefix: gcxtmy.cnf: |[mysqld]log-bin mysql-binhaha hehe 创建
[rootkub-k8s-master prome]# kubectl apply -f configmap.yaml
configmap/test-config4 created 结果如下面data内容所示
[rootkub-k8s-master prome]# kubectl get configmap test-config4 -o yaml
apiVersion: v1
data:cache_host: memcached-gcxtcache_port: 11211cache_prefix: gcxtmy.cnf: |[mysqld]log-bin mysql-binhaha hehe
kind: ConfigMap
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{apiVersion:v1,data:{cache_host:memcached-gcxt,cache_port:11211,cache_prefix:gcxt,my.cnf:[mysqld]\nlog-bin mysql-bin\nhaha hehe\n},kind:ConfigMap,metadata:{annotations:{},name:test-config4,namespace:default}}creationTimestamp: 2023-10-21T08:30:24Zname: test-config4namespace: defaultresourceVersion: 191270selfLink: /api/v1/namespaces/default/configmaps/test-config4uid: 2a8cd6e7-db2c-4781-b005-e0b76d26394b 查看configmap的详细信息
# kubectl describe configmap
2.6 使用ConfigMap 使用ConfigMap的方式一种是通过环境变量的方式直接传递pod另一种是使用volume的方式挂载入到pod内 示例ConfigMap文件
[rootkub-k8s-master prome]# vim config-map.yml
---
apiVersion: v1
kind: ConfigMap
metadata:name: config-mapnamespace: default
data:special.how: veryspecial.type: charm 创建
[rootkub-k8s-master prome]# kubectl apply -f config-map.yml
configmap/config-map created
2.6.1 通过变量使用
(1) 使用valueFrom、configMapKeyRef、name、key指定要用的key:
1.设置指定变量的方式
[rootkub-k8s-master prome]# vim testpod.yml
---
apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: daocloud.io/library/nginxenv: #专门在容器里面设置变量的关键字- name: SPECIAL_LEVEL_KEY #这里的-name,是容器里设置的新变量的名字valueFrom:configMapKeyRef:name: config-map #这里是来源于哪个configMapkey: special.how #configMap里的key- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: config-mapkey: special.typerestartPolicy: Never创建pod
[rootkub-k8s-master prome]# kubectl apply -f testpod.yml
pod/dapi-test-pod created
测试
[rootkub-k8s-master prome]# kubectl exec -it dapi-test-pod /bin/bash
rootdapi-test-pod:/# echo $SPECIAL_TYPE_KEY
charm
(2) 通过envFrom、configMapRef、name使得configmap中的所有key/value对儿 都自动变成环境变量
[rootkub-k8s-master prome]# kubectl delete -f testpod.yml
pod dapi-test-pod deleted
[rootkub-k8s-master prome]# cp testpod.yml testpod.yml.bak
[rootkub-k8s-master prome]# vim testpod.yml
---
apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: daocloud.io/library/nginxenvFrom:- configMapRef:name: config-maprestartPolicy: Never 这样容器里的变量名称直接使用configMap里的key名
[rootkub-k8s-master prome]# kubectl apply -f testpod.yml
pod/dapi-test-pod created.
[rootkub-k8s-master prome]# kubectl exec -it dapi-test-pod /bin/bash
rootdapi-test-pod:/# env
HOSTNAMEdapi-test-pod
NJS_VERSION0.3.3
NGINX_VERSION1.17.1
KUBERNETES_PORT_443_TCP_PROTOtcp
KUBERNETES_PORT_443_TCP_ADDR10.96.0.1
PKG_RELEASE1~stretch
KUBERNETES_PORTtcp://10.96.0.1:443
PWD/
special.howvery
HOME/root
KUBERNETES_SERVICE_PORT_HTTPS443
KUBERNETES_PORT_443_TCP_PORT443
KUBERNETES_PORT_443_TCPtcp://10.96.0.1:443
TERMxterm
SHLVL1
KUBERNETES_SERVICE_PORT443
PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
special.typecharm
KUBERNETES_SERVICE_HOST10.96.0.1
_/usr/bin/env
2.6.2 作为volume挂载使用
(1) 把1.4中test-config4所有key/value挂载进来
[rootkub-k8s-master prome]# kubectl delete -f testpod.yml
pod dapi-test-pod deleted
[rootkub-k8s-master prome]# vim volupod.yml
---
apiVersion: v1
kind: Pod
metadata:name: nginx-configmap
spec:containers:- name: nginx-configmapimage: daocloud.io/library/nginxvolumeMounts:- name: config-volume4mountPath: /tmp/config4volumes:- name: config-volume4configMap:name: test-config4创建pod
[rootkub-k8s-master prome]# kubectl apply -f volupod.yml
pod/nginx-configmap created
进入容器中/tmp/config4查看
[rootkub-k8s-master prome]# kubectl exec -it nginx-configmap /bin/bash
rootnginx-configmap:/# ls /tmp/config4/
cache_host cache_port cache_prefix my.cnf
rootnginx-configmap:/# cat /tmp/config4/cache_host
memcached-gcxt
rootnginx-configmap:/#
可以看到在config4文件夹下以每一个key为文件名,value为内容,创建了多个文件。
2.7 实战案例
创建configmap
[rootkub-k8s-master configmap]# vim configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-server-confnamespace: default
data:index.html: |Hello, cloud computingHello, Mr. Wang[rootkub-k8s-master configmap]# kubectl apply -f configmap.yaml[rootkub-k8s-master configmap]# kubectl get configmap
NAME DATA AGE
nginx-server-conf 2 7s
[rootkub-k8s-master configmap]# kubectl get configmap nginx-server-conf -o yaml使用configmap
[rootkub-k8s-master configmap]# vim pod.yaml
---
apiVersion: v1
kind: Pod
metadata:name: test-webapp
spec:containers:- name: nginx-appimage: daocloud.io/library/nginxports:- containerPort: 80volumeMounts:- name: nginx-volumemountPath: /usr/share/nginx/htmlvolumes:- name: nginx-volumeconfigMap:name: nginx-server-conf
[rootkub-k8s-master configmap]# kubectl apply -f pod.yaml
[rootkub-k8s-master configmap]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-webapp 1/1 Running 0 6s
[rootkub-k8s-master configmap]# kubectl exec -it test-webapp /bin/bash
roottest-webapp:/# cd /usr/share/nginx/html/
roottest-webapp:/usr/share/nginx/html# ls
index.html
roottest-webapp:/usr/share/nginx/html# cat index.html
Hello, cloud computing
Hello, Mr. Wang[rootkub-k8s-master configmap]# curl 10.244.2.25
Hello, cloud computing
Hello, Mr. Wang
三.Downward API Downward API 用于在容器中获取 POD 的基本信息kubernetes原生支持 Downward API提供了两种方式用于将 POD 的信息注入到容器内部 1.环境变量用于单个变量可以将 POD 信息直接注入容器内部。 2.Volume挂载将 POD 信息生成为文件直接挂载到容器内部中去。 3.1 目前 Downward API 支持的字段 1. 使用 fieldRef 可以声明使用: spec.nodeName - 宿主机名字 status.hostIP - 宿主机 IP metadata.name - Pod 的名字 metadata.namespace - Pod 的 Namespace status.podIP - Pod 的 IP spec.serviceAccountName - Pod 的 Service Account 的名字 metadata.uid - Pod 的 UID metadata.labels[KEY] - 指定 KEY 的 Label 值 metadata.annotations[KEY] - 指定 KEY 的 Annotation 值 metadata.labels - Pod 的所有 Label metadata.annotations - Pod 的所有 Annotation 上面这个列表的内容随着 Kubernetes 项目的发展肯定还会不断增加。所以这里列出来的信息仅供参考在使用 Downward API 时还是要记得去查阅一下官方文档。 # 所有基本信息可以使用下面的方式去查看describe方式看不出来
[rootkub-k8s-master configmap]# kubectl get pod test-webapp -o yaml
apiVersion: v1
kind: Pod
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{apiVersion:v1,kind:Pod,metadata:{annotations:{},name:test-webapp,namespace:default},spec:{containers:[{image:daocloud.io/library/nginx,name:nginx-app,volumeMounts:[{mountPath:/usr/share/nginx/html,name:nginx-volume}]}],volumes:[{configMap:{name:nginx-server-conf},name:nginx-volume}]}}creationTimestamp: 2021-02-21T09:44:51Zname: test-webappnamespace: defaultresourceVersion: 270687selfLink: /api/v1/namespaces/default/pods/test-webappuid: ed92d685-f800-464f-95dc-d6aa5f92fc9c
......
3.2 实战案例
使用fieldRef获取 POD 的基本信息以环境变量的方式实现
[rootkub-k8s-master prome]# vim test-env-pod.yml
---
apiVersion: v1
kind: Pod
metadata:name: test-env-podnamespace: kube-system
spec:containers:- name: test-env-podimage: daocloud.io/library/nginxenv:- name: POD_NAME #第一个环境变量的名字valueFrom: #使用valueFrom方式设置fieldRef: #关联一个字段metadata.namefieldPath: metadata.name #这个字段从当前运行的pod详细信息查看- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIP 注意 POD 的 name 和 namespace 属于元数据是在 POD 创建之前就已经定下来了的所以使用 metadata 获取就可以了但是对于 POD 的 IP 则不一样因为POD IP 是不固定的POD 重建了就变了它属于状态数据所以使用 status 去获取。 创建上面的 POD
[rootkub-k8s-master prome]# kubectl apply -f test-env-pod.yml
pod/test-env-pod created
POD 创建成功后查看
[rootkub-k8s-master prome]# kubectl exec -it test-env-pod /bin/bash -n kube-system
roottest-env-pod:/# env | grep POD
POD_NAMEtest-env-pod
POD_NAMESPACEkube-system
POD_IP10.244.1.35
roottest-env-pod:/#
Volume挂载
通过Downward API将 POD 的 Label、等信息通过 Volume 以文件的形式挂载到容器的某个文件中去然后在容器中打印出该文件的值来验证。
[rootkub-k8s-master prome]# vim test-volume-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:name: test-volume-podnamespace: kube-systemlabels:k8s-app: test-volumenode-env: test
spec:containers:- name: test-volume-pod-containerimage: daocloud.io/library/nginxvolumeMounts:- name: podinfomountPath: /etc/podinfovolumes:- name: podinfodownwardAPI:items:- path: labelsfieldRef:fieldPath: metadata.labels
创建上面的 POD
[rootkub-k8s-master prome]# kubectl apply -f test-volume-pod.yaml pod/test-volume-pod created
[rootkub-k8s-master prome]# kubectl get pod -n kube-system
[rootk8s-master prome]# kubectl exec -it test-volume-pod /bin/bash -n kube-system Secret、ConfigMap以及 Downward API 这三种 Projected Volume 定义的信息大多还可以通过环境变量的方式出现在容器里。但是通过环境变量获取这些信息的方式不具备自动更新的能力。一般情况下建议使用 Volume 文件的方式获取这些信息。 四.ServiceAccount详解 官方文档地址Configure Service Accounts for Pods | Kubernetes
k8s中提供了良好的多租户认证管理机制如RBAC、ServiceAccount还有各种Policy等。
什么是 Service Account Pod里的进程也可以与 apiserver 联系。 当它们在联系 apiserver 的时候它们就会被认证为一个特定的 Service Account。 使用场景 Service Account它并不是给kubernetes集群的用户使用的而是给pod里面的进程使用的它为pod提供必要的身份认证。----专门为pod里面的进程和apiserver通信提供认证的。 Service account与User account区别: 1. User account是为人设计的而service account则是为Pod中的进程调用Kubernetes API或其他外部服务而设计的 2. User account是跨namespace的而service account则是仅局限它所在的namespace 3. 每个namespace都会自动创建一个default service account 4. Token controller检测service account的创建并为它们创建secret 4.1 Service Account应用示例
Service Account服务账号示例
因为平时系统会使用默认service account我们不需要自己创建感觉不到service account的存在本实验是使用自己手动创建的service account
1、创建serviceaccount
[rootkub-k8s-master ~]# kubectl create serviceaccount mysa
serviceaccount/mysa created
# yaml 方法创建
[rootkub-k8s-master ~]# vim mysa.yml
apiVersion: v1
kind: ServiceAccount
metadata:name: mysanamespace: default2、查看mysa
[rootkub-k8s-master ~]# kubectl describe sa mysa
Name: mysa
Namespace: default
Labels: none
Annotations: none
Image pull secrets: none
Mountable secrets: mysa-token-cknwf
Tokens: mysa-token-cknwf
Events: none
3、查看mysa自动创建的secret
[rootkub-k8s-master ~]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 11h
default-token-6svwp kubernetes.io/service-account-token 3 4d23h
mysa-token-cknwf kubernetes.io/service-account-token 3 76s
mysecret Opaque 2 11h
mysecret-01 Opaque 2 6h58m
pass Opaque 1 7h6m
user Opaque 1 7h7m4、创建角色和绑定
[rootkub-k8s-master ~]# vim role.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: defaultname: mysa-role
rules:
- apiGroups: []resources: [pods]verbs: [get, watch, list]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: mysa-bindingnamespace: default
subjects:
- kind: ServiceAccountname: mysanamespace: default
roleRef:kind: Rolename: mysa-roleapiGroup: rbac.authorization.k8s.io
5、使用mysa的sa资源配置pod
[rootkub-k8s-master ~]# cd prome/
[rootkub-k8s-master prome]# vim mysa-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: mysa-pod
spec:serviceAccountName: mysacontainers:- name: appimage: 10.36.192.206:8088/newrain857/kubectlcommand: [tail,-f,/dev/null]6、导入
[rootkub-k8s-master prome]# kubectl apply -f .
pod/mysa-pod created
role.rbac.authorization.k8s.io/mysa-role created
rolebinding.rbac.authorization.k8s.io/mysa-binding created
serviceaccount/mysa created
7、查看
[rootkub-k8s-master prome]# kubectl get pod mysa-pod -o yaml
8、测试
[rootkube-master sa]# kubectl exec -it mysa-pod /bin/sh
/ # kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 1 (50m ago) 17h
mysa-pod 1/1 Running 0 9m5s
/ # kubectl delete pod nginx
Error from server (Forbidden): pods nginx is forbidden: User system:serviceaccount:default:pod-reader cannot delete resource pods in API group in the namespace default# 可以看到我们已经成功限制了pod对资源的访问
五.RBAC 详解(基于角色的访问控制) 在Kubernetes中授权有ABAC基于属性的访问控制、RBAC基于角色的访问控制、Webhook、Node、AlwaysDeny一直拒绝和AlwaysAllow一直允许这6种模式。 RBAC基于角色的访问控制--全拼Role-Based Access Control----做权限控制的顾名思义就是通过给角色赋予相应的权限从而使得该角色具有访问相关资源的权限。 k8s里面有两种用户,一种是User,一种就是service account(服务使用的账号)。 User account是为人设计的属于用户账户个人使用的账号此外User Account是跨Namespace的而ServiceAccount则是仅局限它所在的Namespace。 在RABC API中通过如下的步骤进行授权 1定义角色在定义角色时会指定此角色对于资源的访问控制的规则 2绑定角色将主体与角色进行绑定对用户进行访问授权。 在K8s中这些资源分属于两个级别名称空间role/rolebinding和集群级别clusterrole/clusterrolebinding这两个都是标准的K8s资源可以直接定义。 Role与ClusterRole Role普通角色:一个Role对象只能用于授予对某一单一命名空间中资源的访问权限普通角色只是在当前的名称空间生效。 ClusterRole集群角色:整个Kubernetes集群范围内有效的角色则通过ClusterRole对象实现可以访问整个集群资源。 简介 role/ClusterRole: 1、允许的操作如get,list,update,create,delete等权限 2、允许操作的对象如pod,svc等资源 rolebinding:将哪个用户绑定到哪个role上 clusterrolebinding:绑定到集群角色上 如果使用clusterrolebinding绑定到clusterrole上表示绑定的用户拥有所有namespace的权限 #这里面有哪些重要的东西roleclusterrolebinding账号。 5.1 创建k8s账号与RBAC授权使用
创建账号
1、创建私钥
[rootkub-k8s-master ~]# (umask 077; openssl genrsa -out soso.key 2048)
Generating RSA private key, 2048 bit long modulus
...............................
..........................
e is 65537 (0x10001)用此私钥创建一个csr(证书签名请求)文件
[rootkub-k8s-master ~]# openssl req -new -key soso.key -out soso.csr -subj /CNsoso # 这个地方是用户名拿着私钥和请求文件生成证书
[rootkub-k8s-master ~]# openssl x509 -req -in soso.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out soso.crt -days 365
Signature ok
subject/CNsoso
Getting CA Private Key生成账号
[rootkub-k8s-master ~]# kubectl config set-credentials soso --client-certificatesoso.crt --client-keysoso.key --embed-certstrue
User soso set.3、设置上下文环境--指的是创建这个账号的环境在当前名称空间中
[rootkub-k8s-master ~]# kubectl config set-context sosokubernetes --clusterkubernetes --usersoso
Context sosokubernetes created.
查看当前的工作上下文
[rootkub-k8s-master ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:certificate-authority-data: DATAOMITTEDserver: https://192.168.96.10:6443
....
4、切换用户切换上下文
[rootkub-k8s-master ~]# kubectl config use-context sosokubernetes
Switched to context sosokubernetes.
验证是否已经切换到了新的上下文
[rootkub-k8s-master ~]# kubectl config current-context
sosokubernetes
5.测试还未赋予权限
[rootkub-k8s-master ~]# kubectl get pod
Error from server (Forbidden): pods is forbidden: User soso cannot list resource pods in API group in the namespace default
创建一个角色role---设置权限
1.切回管理帐号先
[rootkub-k8s-master ~]# kubectl config use-context kubernetes-adminkubernetes
Switched to context kubernetes-adminkubernetes.创建角色命令
[rootkub-k8s-master ~]# kubectl create role role-reader --verbget,list,watch --resourcepod,svc
role.rbac.authorization.k8s.io/role-reader created
--verb 相当于是权限
--resource给什么资源使用yaml文件方式:
[rootkub-k8s-master ~]# vim role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: role-reader
rules: #定义规则- apiGroups: [] #表示当前pod使用核心的APIserver组默认用表示就可以resources: [pods,svc]verbs: [get, list, watch, create, update, delete] #[*]表示所有权限[rootkub-k8s-master ~]# kubectl apply -f role.yaml
role.rbac.authorization.k8s.io/role-reader created[rootkub-k8s-master ~]# kubectl get roles
NAME AGE
role-reader 30s[rootkub-k8s-master ~]# kubectl describe role role-reader
Name: role-reader
Labels: none
Annotations: kubectl.kubernetes.io/last-applied-configuration:{apiVersion:rbac.authorization.k8s.io/v1beta1,kind:Role,metadata:{annotations:{},name:role-reader,namespace:default},...
PolicyRule:Resources Non-Resource URLs Resource Names Verbs--------- ----------------- -------------- -----pods [] [] [get list watch create update delete]svc [] [] [get list watch create update delete]
2.绑定用户soso上面创建的用户绑定用户到role-reader
[rootkub-k8s-master ~]# kubectl create rolebinding myrole-binding --rolerole-reader --usersoso
rolebinding.rbac.authorization.k8s.io/myrole-binding created
yaml文件方式
[rootk8s-master ~]# vim role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: myrolebind
subjects: #定义对那个主体进行操作有三种Subjects:Service Account、User Account、Groups
- kind: Username: sosoapiGroup: rbac.authorization.k8s.io
roleRef: #定义使用哪个角色kind: Rolename: role-readerapiGroup: rbac.authorization.k8s.io
[rootk8s-master ~]# kubectl apply -f role-binding.yaml
rolebinding.rbac.authorization.k8s.io/myrolebind created
[rootk8s-master ~]# kubectl get rolebinding
NAME AGE
myrolebind 25s
3.切换用户
[rootkub-k8s-master ~]# kubectl config use-context sosokubernetes
Switched to context sosokubernetes.
4.查看权限只授权了default名称空间pod和svc的getlistwatch权限
[rootkub-k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
lifecycle-demo 1/1 Running 1 22h
mypod 1/1 Running 0 8h
nginx-configmap 1/1 Running 0 4h29m
nginx-pod 1/1 Running 0 39m
[rootkub-k8s-master ~]# kubectl get pod -n kube-system #无权访问kube-system
Error from server (Forbidden): pods is forbidden: User soso cannot list resource pods in API group in the namespace kube-system
[rootkub-k8s-master ~]# kubectl delete pod nginx-pod #无权限删除
Error from server (Forbidden): pods nginx-pod is forbidden: User soso cannot delete resource pods in API group in the namespace default
5.切换用户
[rootkub-k8s-master ~]# kubectl config use-context kubernetes-adminkubernetes
Switched to context kubernetes-adminkubernetes.
实验二绑定用户到集群角色
6.删除soso账号之前绑定的rolebinding
[rootkub-k8s-master ~]# kubectl delete rolebinding myrolebind
rolebinding.rbac.authorization.k8s.io myrolebind deleted
7.创建clusterrole #可以访问全部的namespace
[rootkub-k8s-master ~]# kubectl create clusterrole myclusterrole --verbget,list,watch --resourcepod,svc
clusterrole.rbac.authorization.k8s.io/myclusterrole created
yaml文件方式
[rootkub-k8s-master ~]# vim clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: myclusterrole
rules:
- apiGroups:- resources:- podsverbs:- get- list- watch
[rootkub-k8s-master ~]# kubectl apply -f clusterrole.yaml
[rootkub-k8s-master ~]# kubectl get clusterrole
8.绑定集群角色到用户soso
[rootkub-k8s-master ~]# kubectl create clusterrolebinding my-cluster-rolebinding --clusterrolemyclusterrole --usersoso
clusterrolebinding.rbac.authorization.k8s.io/my-cluster-rolebinding created
yaml文件方式
[rootkub-k8s-master ~]# vim clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: my-cluster-rolebinding
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.iokind: Username: soso
[rootkub-k8s-master ~]# kubectl apply -f clusterrolebinding.yaml
[rootkub-k8s-master ~]# kubectl get clusterrolebinding
9.切换账号
[rootkub-k8s-master ~]# kubectl config use-context sosokubernetes
Switched to context sosokubernetes.
10.查看权限 查看kube-system空间的pod
[rootkub-k8s-master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5644d7b6d9-sm8hs 1/1 Running 0 5d
coredns-5644d7b6d9-vddll 1/1 Running 0 5d
etcd-kub-k8s-master 1/1 Running 0 5d
...
注意11.切换为管理员用户
[rootkub-k8s-master ~]# kubectl config use-context kubernetes-adminkubernetes
5.2 设置上下文和账户切换
设置工作上下文前提得有用户
[rootkub-k8s-master ~]# kubectl config set-context sosokubernetes --clusterkubernetes --usersoso
Context sosokubernetes created.
查看当前的工作上下文
[rootkub-k8s-master ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:
....
切换上下文切换用户
[rootkub-k8s-master ~]# kubectl config use-context sosokubernetes
Switched to context sosokubernetes.
切换为管理员用户
[rootkub-k8s-master prome]# kubectl config use-context kubernetes-adminkubernetes
Switched to context kubernetes-adminkubernetes.
查看某个资源类型是由哪个apiserver版本提供
[rootkub-k8s-master ~]# kubectl explain ClusterRole