[toc]
kubernetes 操作记录四
kubernetes认证及Service Account
在master服务器上启动 proxy 并监听至8080
# kubectl proxy --port=8080 & # curl http://localhost:8080/api/v1/namespaces
仅有权限获取当前Pod自身的相关信息
# kubectl get secret -n ingress-nginx NAME TYPE DATA AGE default-token-t54dl kubernetes.io/service-account-token 3 5d23h nginx-ingress-serviceaccount-token-5dwv4 kubernetes.io/service-account-token 3 5d23h
生成yaml框架,快速编写清单
# kubectl create serviceaccount mysa -o yaml --dry-run apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: null name: mysa # kubectl get pods myapp-deploy-675558bfc5-2rfrs -o yaml --export
# kubectl create serviceaccount admin # kubectl describe sa admin Name: admin Namespace: default Labels: <none> Annotations: <none> Image pull secrets: <none> Mountable secrets: admin-token-hxqqf Tokens: admin-token-hxqqf Events: <none> # kubectl get secret NAME TYPE DATA AGE admin-token-hxqqf kubernetes.io/service-account-token 3 66s default-token-2sgn5 kubernetes.io/service-account-token 3 26d mysql-root-password Opaque 1 45h tomcat-ingress-secret kubernetes.io/tls 2 5d22h
# vim pod-sa-demo.yaml apiVersion: v1 kind: Pod metadata: name: pod-sa-demo namespace: default labels: app: myapp tier: frontend annotations: ssjinyao.com/create-by: "cluster admin" spec: containers: - name: myapp image: ikubernetes/myapp:v1 ports: - name: http containerPort: 80 serviceAccountName: admin # kubectl apply -f pod-sa-demo.yaml # kubectl describe pods pod-sa-demo | grep 'SecretName' SecretName: admin-token-hxqqf
kubernetes 集群有两类认证时的用户账号
useraccount,我们称之为用户账号,通常定义的是人使用的账号
servicecacount, 服务账号,指pod中应用的应用程序运行在kubernetes ,想访问apiserver时用的认证信息,包括用户名密码等等;
# kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://10.1.87.80:6443 name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes current-context: kubernetes-admin@kubernetes kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: REDACTED client-key-data: REDACTED
/etc/kubernetes/pki # (umask 077; openssl genrsa -out ssjinyao.key 2048) # openssl req -new -key ssjinyao.key -out ssjinyao.csr -subj "/CN=ssjinyao" # openssl x509 -req -in ssjinyao.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out ssjinyao.crt -days 36500 Signature ok subject=/CN=ssjinyao Getting CA Private Key # openssl x509 -in ssjinyao.crt -text -noout Certificate: Data: Version: 1 (0x0) Serial Number: f3:fe:ff:e5:0e:0b:37:e2 Signature Algorithm: sha256WithRSAEncryption Issuer: CN=kubernetes Validity Not Before: May 22 07:57:01 2019 GMT Not After : Apr 28 07:57:01 2119 GMT Subject: CN=ssjinyao Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit)
接下来把用户账号信息添加到连接kubernetes 的配置信息
# kubectl config set-credentials ssjinyao --client-certificate=./ssjinyao.crt --client-key=./ssjinyao.key --embed-certs=true User "ssjinyao" set. # kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://10.1.87.80:6443 name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes current-context: kubernetes-admin@kubernetes kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: REDACTED client-key-data: REDACTED - name: ssjinyao user: client-certificate: /etc/kubernetes/pki/ssjinyao.crt client-key: /etc/kubernetes/pki/ssjinyao.key # kubectl config set-context ssjinyao@kubernetes --cluster=kueberntes --user=ssjinyao Context "ssjinyao@kubernetes" created. # kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://10.1.87.80:6443 name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes - context: cluster: kueberntes user: ssjinyao name: ssjinyao@kubernetes current-context: kubernetes-admin@kubernetes kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: REDACTED client-key-data: REDACTED - name: ssjinyao user: client-certificate: /etc/kubernetes/pki/ssjinyao.crt client-key: /etc/kubernetes/pki/ssjinyao.key
这时候多了一个context, 可切换用户
# kubectl config use-context ssjinyao@kubernetes Switched to context "ssjinyao@kubernetes".
# kubectl config set-cluster mycluster --kubeconfig=/tmp/test.conf --server="https://10.1.87.80:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true Cluster "mycluster" set. # kubectl config view --kubeconfig=/tmp/test.conf apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://10.1.87.80:6443 name: mycluster contexts: [] current-context: "" kind: Config preferences: {} users: []
RBAC
授权插件: Node, ABAC,RBAC,Webhook(基于http的回调来实现)
RBAC: Role-based AC
角色 (role)
许可 (permission)
role: operations,objects
rolebinding: user account OR service account , role
clusterrole: clusterrolebinding
操作: GET HEAD PUT PUST PATCH DELETE
role binding定义
# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml > role-demo.yaml # vim role-demo.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: creationTimestamp: null name: pods-reader namespace: default rules: - apiGroups: - "" resources: - pods verbs: - get - list - watch # kubectl apply -f role-demo.yaml # kubectl describe role pods-reader Name: pods-reader Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"annotations":{},"creationTimestamp":null,"name":"pods-reader","nam... PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods [] [] [get list watch] # kubectl create rolebinding ssjinyao-read-pods --role=pods-reader --user=ssjinyao --dry-run -o yaml > rolebinding-demo.yaml # vim rolebinding-demo.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: null name: ssjinyao-read-pods roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: pods-reader subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: ssjinyao
clusterrole binding 定义
# useradd ik8s # cp -a .kube/ /home/ik8s/ # chown -R ik8s.ik8s /home/ik8s/ #
# kubectl config use-context kubernetes-admin@kubernetes # kubectl create clusterrole cluster-reader --verb=get,list,watch --resource=pods -o yaml --dry-run > clusterrole-demo.yaml # vim clusterrole-demo.yaml kind: ClusterRole metadata: name: cluster-reader rules: - apiGroups: - "" resources: - pods verbs: - get - list - watch # kubectl apply -f clusterrole-demo.yaml clusterrole.rbac.authorization.k8s.io/cluster-reader created # kubectl create clusterrolebinding ssjinyao-read-all-pods --clusterrole=cluster-reader --user=ssjinyao --dry-run -o yaml > clusterrolebind-demo.yaml
cluster-role 被 rolebinding 会使的cluster 被降级
# kubectl create rolebinding ssjinyao-read-pods --clusterrole=cluster-reader --user=ssjinayo --dry-run -o yaml > rolebinding-clusterrole-demo.yaml
查看系统默认的授权
引用授权
# kubectl get clusterrole admin -o yaml # kubectl create rolebinding default-ns-admin --clusterrole=admin --user=ssjinyao rolebinding.rbac.authorization.k8s.io/default-ns-admin created
dashboard 及认证分级授权
部署 dashboard
# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
部署时下载镜像出错
# kubectl describe pods -n kube-system kubernetes-dashboard-5f7b999d65-jpmhs Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 113s default-scheduler Successfully assigned kube-system/kubernetes-dashboard-5f7b999d65-jpmhs to node01 Warning Failed 53s (x3 over 105s) kubelet, node01 Failed to pull image "k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1": rpc error: code = Unknown desc = Error response from daemon: Get https://k8s.gcr.io/v2/: dial tcp 74.125.203.82:443: connect: connection timed out Warning Failed 53s (x3 over 105s) kubelet, node01 Error: ErrImagePull Normal BackOff 15s (x5 over 105s) kubelet, node01 Back-off pulling image "k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1" Warning Failed 15s (x5 over 105s) kubelet, node01 Error: ImagePullBackOff Normal Pulling 2s (x4 over 112s) kubelet, 01 Pulling image "k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1"
用手动下载的方法进行解决
# vim docker_install_dashboard.sh #!/bin/sh docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1 docker tag mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1 docker rmi mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1 # sh docker_install_dashboard.sh
然后再执行以下部署清单
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml # kubectl get pods -n kube-system | grep dash kubernetes-dashboard-5f7b999d65-fcb28 1/1 Running 0 71s
可以看到kubernetes-dashbroad 已经运行
默认服务暴露为ClusterIP类型的,我们需要将其改为NodePort 类型
# kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kube-system # kubectl get svc -n kube-system \NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 27d kubernetes-dashboard NodePort 10.109.190.204 <none> 443:31984/TCP 3m41s
这个时候可以看到登录界面
使用用token实现认证登录
这里登录需要的是serviceaccount用户, 所以这里创建 serviceaccount
# kubectl create serviceaccount dashboard-admin -n kube-system serviceaccount/dashboard-admin created # kubectl get sa -n kube-system | grep dash dashboard-admin 1 6m33s
serviceaccount 创建好后, 需要将serviceaccount绑定cluster这个角色上
# kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin clusterrolebinding.rbac.authorization.k8s.io/dashboard-cluster-admin created # kubectl get secret -n kube-system | grep dash dashboard-admin-token-grj84 kubernetes.io/service-account-token 3 5m46s
绑定好 cluster 后, 查看token信息,并拿token进行登录
# kubectl describe secret -n kube-system dashboard-admin-token-grj84
登录后,可以看到整个kubernetes集群的概况
建立专用dashborad用户
# cd /etc/kubernetes/pki/ # (umask 077; openssl genrsa -out dashboard.key 2048) # openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=ssjinyao/CN=dashboard" # openssl x509 -req -in dashboard.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dashboard.crt -days 3650 Signature ok subject=/O=ssjinyao/CN=dashboard Getting CA Private Key # kubectl create secret generic dashboard-cert -n kube-system --from-file=dashboard.crt=./dashboard.crt --from-file=dashboard.key=./dashboard.key secret/dashboard-cert created
# kubectl create serviceaccount def-ns-admin -n default serviceaccount/def-ns-admin created
role binding 到 default 名称空间,只允许访问default 名称空间
# kubectl create rolebinding def-ns-admin --clusterrole=admin --serviceaccount=default:def-ns-admin rolebinding.rbac.authorization.k8s.io/def-ns-admin created # kubectl describe secret admin-token-hxqqf # 查看 token信息登录
接下来配置kube config 文件认证
# kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://10.1.87.80:6443" --embed-certs=true --kubeconfig=/root/def-ns-admin.conf Cluster "kubernetes" set. # kubectl config view --kubeconfig=/root/def-ns-admin.conf apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://10.1.87.80:6443 name: kubernetes contexts: [] current-context: "" kind: Config preferences: {} users: []
# CLUSTER_ADMIN_TOKEN=$(kubectl get secret -n kube-system dashboard-admin-token-grj84 -o jsonpath={.data.token} | base64 -d ) # kubectl config set-credentials dashboard-cluster-admin --token=$CLUSTER_ADMIN_TOKEN --kubeconfig=/root/def-ns-admin.conf User "dashboard-cluster-admin" set. # kubectl config set-context dashboard-cluster-admin@kubernetes --cluster=kubernetes --user=dashboard-cluster-admin --kubeconfig=/root/def-ns-admin.conf # kubectl config use-context dashboard-cluster-admin@kubernetes --kubeconfig=/root/def-ns-admin.conf
将生成的conf文件远程复制到桌面上
ssjinyao ➤ scp root@10.1.87.80:/root/def-ns-admin.conf ~/Desktop
此时使用可以用 kubeconfig 来登录dashboard 了