使用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
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
相关文章推荐
- Android 使用binder访问service的方式
- Android使用binder访问service的方式(一)
- Android使用binder访问service的方式
- WIN2012远程桌面用户建立使用FIREFOX访问内网OA的快捷方式
- Android使用binder访问service的方式(一)
- Android使用binder访问service的方式
- -----------------------------Android使用binder访问service的方式(一)
- Android使用binder访问service的方式(一)
- Android使用binder访问service的方式(一)
- 远程桌面访问之VNC使用指南
- 远程访问、远程演示工具LookMyPC的点对点使用流程
- 配置远程客户机使用命名管道协议访问SQL服务器
- 使用PsEXEC远程批量更新msdtc使用无安全认证方式
- 通过Spring使用远程访问和web服务
- 通过Spring使用远程访问和web服务
- 不安装 oracle的客户,就可以使用pl/sql访问远程oracle 数据库的方法
- 关于sql 2005 express 远程访问和sa密码的问题(转帖)
- 使用Spring进行远程访问与Web服务