首页 > 其他分享 >创建openssl证书,实现集群外访问k8s api

创建openssl证书,实现集群外访问k8s api

时间:2022-11-14 20:55:30浏览次数:64  
标签:kubectl crt admin openssl -- api key k8s

创建认证信息

首先假设你装好了openssl (没装执行 sudo yum install openssl openssl-devel)

1、创建一个文件夹叫做 openssl-cert/

$ mkdir -p ~/openssl-cert && cd ~/openssl-cert

2、执行

  • 生成key
$ openssl genrsa -out admin.key 2048

(这一步是生成客户端私钥)

$ openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/"

(根据私钥生成csr, /CN指定了用户名admin)

3、生成证书

$ sudo openssl x509 -req -in admin.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out admin.crt -days 365

(根据k8s的CA证书生成我们用户的客户端证书)

证书反解

如果你忘了证书设置的CN(Common name)是啥 可以用下面的命令搞定

$ openssl x509 -noout -subject -in admin.crt

使用证书

查看集群的endpoints

$ kubectl get endpoints  
NAME         ENDPOINTS           AGE
kubernetes   192.168.0.41:6443   11m

查看集群的版本:

$ curl --cert ./admin.crt --key ./admin.key \
--cacert /etc/kubernetes/pki/ca.crt -s https://192.168.0.41:6443/version
{
  "major": "1",
  "minor": "22",
  "gitVersion": "v1.22.0",
  "gitCommit": "c2b5237ccd9c0f1d600d3072634ca66cefdf272f",
  "gitTreeState": "clean",
  "buildDate": "2021-08-04T17:57:25Z",
  "goVersion": "go1.16.6",
  "compiler": "gc",
  "platform": "linux/amd64"
}

查看POD:

$ curl --cert ./admin.crt --key ./admin.key \
--cacert /etc/kubernetes/pki/ca.crt -s https://192.168.0.41:6443/api/v1/pods
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "pods is forbidden: User \"admin\" cannot list resource \"pods\" in API group \"\" at the cluster scope",
  "reason": "Forbidden",
  "details": {
    "kind": "pods"
  },
  "code": 403
}

能够看到我们的请求被拦截了,原因是禁止访问,这是因为授权没有通过。

加入到kubeconfig

把client.crt加入到~/.kube/config

$ kubectl config set-credentials admin \
--client-certificate=admin.crt \
--client-key=admin.key \
--embed-certs=true

这一步把用户设置到config文件中。也可以加上“--embed-certs=true”选项,直接将文件内容填充到config文件中。

添加一个context

$ kubectl config set-context admin \
--cluster=kubernetes  \
--user=admin

添加完成后config文件变化:

...
contexts:
- context:
    cluster: minikube
    user: admin
  name: admin
..  

切换context:

$ kubectl config use-context admin 

此时访问再次查看pod:

$ kubectl get pods
Error from server (Forbidden): pods is forbidden: User "admin" cannot list resource "pods" in API group "" in the namespace "default"

能够看到是被禁止访问的。说明我们的请求没有经过授权(Authorization)。

添加角色和绑定角色

需要先切换上下文到用户kubernetes-admin下:

$ kubectl config use-context kubernetes-admin

为此我们需要使用RABC为用户admin授予操作权限

$ kubectl create role developer  \
--verb=create \
--verb=get \
--verb=list \
--verb=update \
--verb=delete \
--resource=pods

绑定角色:

$ kubectl create rolebinding developer-binding-admin --role=developer --user=admin

注意:以上所绑定的role,默认只能访问default命名空间下的POD,添加-n选项,指定能访问的命名空间

切回到admin用户下,创建Nginx POD

$ kubectl run nginx --image=nginx

再次查看POD,请求没有被拦截

$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          117s

以API方式,访问默认命名空间下的内容,也能正常访问

$ curl --cert admin.crt \
--key admin.key \
--cacert  /etc/kubernetes/pki/ca.crt  \
https://192.168.0.41:6443/api/v1/namespaces/default/pods
{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {
    "resourceVersion": "2714"
  },
  "items": [
    {
      "metadata": {
        "name": "nginx",
        "namespace": "default",
        "uid": "e5b9381c-a1ca-4632-abb0-afbc9cb56e0b",
        "resourceVersion": "2682",
        "creationTimestamp": "2022-11-08T13:05:54Z",
        "labels": {
          "run": "nginx"
        },
        "managedFields": [
          {
...

删除POD:

$ kubectl delete pod/nginx
pod "nginx" deleted

访问default命名空间下的service和deploy

$ kubectl get svc,deploy
Error from server (Forbidden): services is forbidden: User "admin" cannot list resource "services" in API group "" in the namespace "default"
Error from server (Forbidden): deployments.apps is forbidden: User "admin" cannot list resource "deployments" in API group "apps" in the namespace "default"

请求被拦截,没有访问权限。这是因为上面我们在创建角色的时候,指定了只能访问POD,如果想要访问其他资源,修改角色即可。

在APIFOX中测试

将上面的server.crt和server.key下载,并导入到apifox中

请求API:/api/v1/namespaces/default/pods

 

 

参考:

在Kubernetes中如何生成证书:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/certificates/#cfssl

如何管理集群中的TLS证书:https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/

 如何创建CSR证书请求:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests/#create-role-and-role-binding

标签:kubectl,crt,admin,openssl,--,api,key,k8s
From: https://www.cnblogs.com/cosmos-wong/p/16890364.html

相关文章

  • 实验7:基于REST API的SDN北向应用实践
    实验要求(一)基本要求1、编写Python程序,调用OpenDaylight的北向接口实现以下功能(1)利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;启动ODL./distribution-kar......
  • 实验7:基于REST API的SDN北向应用实践
    (一)基本要求1、编写Python程序,调用OpenDaylight的北向接口实现以下功能(1)利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;启动ODL./distribution-karaf-0.6.4-C......
  • 什么是API
    api是应用程序编程接口;举个例子:客户端发送异步请求到服务器请求数据,无论是客户端请求数据还是服务端响应数据,都要通过接口地址来通知,通信的时候使用了协议规定传递数......
  • 58. vue常用的api
    1. nextTick 使用场景:通过异步渲染的页面解构不能直接dom操作,要使用nextTick(延迟回调)等待一下;nextTick的作用:感知dom的更新完成,类似于updated;2.set用来追加响......
  • 运行EasyCVR程序时,提示“缺少api-ms-win-crt-stdio-|1-1-0.dll”该如何解决?
    EasyCVR视频融合云服务支持海量视频汇聚与管理、处理、分发等视频能力。平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管......
  • 7.Gateway:Spring Cloud API网关组件(非常详细)
    在微服务架构中,一个系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,......
  • rancher prometheus监控API未就绪
    目录rancherprometheus监控API未就绪背景问题排查问题解决rancherprometheus监控API未就绪背景rancher在应用商店部署了自带的prometheus后,由于闲杂人员比较多,发现监......
  • 百度离线地图JS API V3.0
    首先,百度地图JavaScriptAPI3.0版本与2.0版本相比增加了几个小功能,整体没有大的改动,具体可以在官网上查阅。于是就照着先前大佬们分享的2.0离线版本进行3.0版本的制作,附上......
  • api与头文件
    1.头文件是层层封装的如iostream中的cout函数调用的是istream和ostream中的函数,而istream和ostream中的函数又是调用下一个头文件中的函数将你程序的函数全拆开成源码就是......
  • k8s-codedns 域名解析
    1、 CoreDNS的大多数功能都是由插件来实现的,插件和服务本身都使用了Caddy提供的一些功能,所以项目本身也不是特别的复杂。pod与pod之间调用,可以通过名字或者svc直接访......