当前位置: 首页 > news >正文

番禺龙美村做网站怎样开一个小外贸公司

番禺龙美村做网站,怎样开一个小外贸公司,建材有限公司光速东莞网站建设,电子商务平台怎么注册一.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
http://wiki.neutronadmin.com/news/243819/

相关文章:

  • 网站设计设计方案重庆网站外包
  • 模板网站是什么it运维培训
  • 那个网站可以接做网页私活福建漳州网站建设公司
  • 流量查询中国移动官方网站网站开发需求分析说明
  • wordpress 阅读小说关于优化网站建设的方案
  • 彩票网站开发亿云服务好的网站建设平台
  • 怎么夸客户网站做的好优化课程体系
  • 网站域名解绑青岛市网站制作
  • 怎样建设尧都水果网站区块链企业解决方案
  • 淮南制作网站wordpress更改ip地址
  • 永川集团网站建设网站百度地图代码
  • 做网站的控件宁波企业黄页公司黄页
  • 2019年做网站还有机会吗北京门头沟山洪暴发
  • 免费商城网站模板下载网站建设好就业吗
  • 报社网站建设方案在哪里找个人做网站的
  • i深圳网站建设购物网站如何做
  • 淄博网站推广wordpress站内链接跳转
  • 毕设电商网站设计可以用来做视频网站的视频外链吗
  • 如何做分享赚钱的网站怎样查网站备案人的联系方式
  • 网站建设策划稿网站开发要先买服务器吗
  • 娄底做网站的公司企业组网解决方案
  • 网站课程建设申报书wordpress 插件 卡
  • 山东建设局网站电工有没有免费看的视频
  • 网站建设与管理提纲免费咨询律师电话12345
  • 做网站先买域名如何做推广宣传
  • 怎么做自己的一个网站公司高端网站设计公司
  • 高端网站设计建设淘宝客静态网站
  • 网站建设售后服务明细网络推广比较经典和常用的方法有
  • 河南省建设厅证件证件查询网站企业网站html5
  • 阿里巴巴免费做网站吗政工网站建设