您的位置:首页 > 其它

使用service account(sa) 方式 远程访问k8s集群

2018-03-02 11:47 3563 查看
使用service account(sa) 方式 远程访问k8s集群:

Service Account包括三个部分:
namespace,token和CA证书
所以我们需要做的就是在集群中创建一个新的sa用于部署,然后将上面三样东西配置在kubectl客户端就可以了。

一、Master机器上创建sa 以及获取cat.crt 和token 文件:
1.准备一个目录:
  mkdir test-sa && cd test-sa

2.创建一个新的SA
[root@master ~]# kubectl create sa test-sa
serviceaccount "test-sa" created

3.获得secret的名字,并添加到env中
[root@master ~]# kubectl get sa test-sa -o json | jq -r .secrets[].name
test-sa-token-8nct5
test@client:~/k8s/sa$ export secret=cicd-token-zl0pm

4.获取CA证书
[root@master test-sa]# kubectl get secret $secret -o json | jq -r '.data["ca.crt"]' | base64 -d > ca.crt

5.获取token
[root@master test-sa]# kubectl get secret $secret -o json | jq -r '.data["token"]' | base64 -d >./token

6.查看ca、token
[root@master test-sa]# ls 
ca.crt  token

二、在客户机器上配置kubectl
1.下载kubectl
# Linux
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl 添加到用户目录里
chmod +x ./kubectl
sudo mv ./kubectl /usr/client/bin/kubectl

2.下载上一个步骤的ca.crt 和 token 到客户端机器:
test@client:mkdir k8s/test/sa/test-sa/ && cd k8s/test/sa/test-sa/
test@client:~/k8s/test/sa/test-sa$ scp -r root@192.168.0.4:/root/sa/test-sa .

3.设置cluster
a.添加一个名字叫remote-k8s的集群:
--server: 这里设置为kubernetes集群的api地址。
test@client:~/k8s/test/sa/test-sa$ kubectl config set-cluster remote-k8s --embed-certs=true --server=https://192.168.0.4:6443 --certificate-authority=./ca.crt
Cluster "remote-k8s" set.

b.设置用户 credentials
test@client:~/k8s/test/sa/test-sa$ kubectl config set-credentials test-sa --token=`cat ./token`
User "user-cicd" set.

c.绑定cluster和用户
test@client:~/k8s/sa$ kubectl config set-context remote-k8s-context --cluster=remote-k8s --user=test-sa --namespace=default
Context "k8s-client-context" set.

d.切换到刚才设置的context
kubectl config use-context remote-k8s-context

e.测试一下是否完成
test@client:~/k8s/test/sa/test-sa$ kubectl version
Client Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.8", GitCommit:"ee6162cc70b4a39a7f39391564e0dd0be60aaae9", GitTreeState:"clean", BuildDate:"2017-10-05T06:54:19Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.8", GitCommit:"ee6162cc70b4a39a7f39391564e0dd0be60aaae9", GitTreeState:"clean", BuildDate:"2017-10-05T06:35:40Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}

三、给sa授权
这时 test-sa 还没授予权限,所以还没权限执行kubect get 、kubectl create ...的动作,我们需要给test-sa赋予相关权限:
test@client:~/k8s/test/sa/test-sa$ kubectl get po
Error from server (Forbidden): User "system:serviceaccount:default:test-sa" cannot list pods in the namespace "default". (get pods)
...

在此,我们给test-sa赋予权限,在Master机器上执行:
1.1.serviceaccount(cicd)绑定一个具有发布、部署role(edit) :
kubectl create rolebinding test-sa \
  --clusterrole=edit \
  --serviceaccount=default:test-sa \
  --namespace=default

1.2.serviceaccount(test)绑定一个具有集群管理员role(cluster-admin) :
kubectl --kubeconfig ./admin.conf create clusterrolebinding test \
  --clusterrole=cluster-admin \
  --serviceaccount=default:test \
  --namespace=default

2. 这时,在客户端再执行查询,已经没有权限问题了:
test@client:~/k8s/test/sa/test-sa$ kubectl get po
NAME                       READY     STATUS    RESTARTS   AGE
counter-3896967466-jsqgk   1/1       Running   1          29d
counter-3896967466-z1xz4   1/1       Running   1          29d

##########################################################################################
技巧:

1.帐号切换方法:
kubectl config use-context cicd
kubectl config use-context test

2.使用kubectl proxy
kubernetes的API默认只有本机才能访问到的,所以我们首先需要搭建一个proxy,转发一下外网的请求,这里采用自带的kubectl proxy
kubectl proxy --address='0.0.0.0' --port=8001 --accept-hosts='^*$'
这条命令实现了这么几个功能,监听8001端口,任何ip来源的请求,所有来源都准入。集群的准入准出通过阿里云的安全组策略控制,所有我们这里直接允许所有的请求即可。

3. 配置pod使用指定的service account
...
    spec:
      serviceAccountName: test-sa
...

4. jq 安装,先安装epel: http://www.cnblogs.com/CaptainLin/p/7064520.html
kubernetes sa的权限参考:https://kubernetes.io/docs/admin/authorization/rbac/#service-account-permissions
edit 规则可以查看:https://kubernetes.io/docs/admin/authorization/rbac/#default-roles-and-role-bindings
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kubernetes