共计 8088 个字符,预计需要花费 21 分钟才能阅读完成。
写在开篇
这几天有点忙,终于抽出工夫更新了,之前曾经通过这篇《通过源码剖析通知你:当拜访 K8S API 的代码运行在 POD 里的容器时,在集群内是如何进行身份验证的》搞清楚了在集群内如何进行身份验证。那么,官网还提供了一个简略的利用示例,链接:https://github.com/kubernetes/client-go/tree/master/examples/in-cluster-client-configuration
本篇的主题是解读一下这个示例。联合之前的常识储备并等本篇讲完后,就会很清晰的晓得集群内的 POD 拜访 API 时是如何进行身份验证的。下次就要回到这篇《对于 ServiceAccount 以及在集群内拜访 K8S API》持续解说接下来的实战内容了,有没有发现兜了个圈又兜回来了。
示例代码剖析
针对官网提供的示例,我做了点小革新。这段代码是一个应用 Kubernetes Go 客户端(client-go)的示例程序,用于获取 Kubernetes 集群中所有 Pod 的信息,并每隔 10 秒打印一次 Pod 的数量和 POD 名称。
package main | |
import ( | |
"context" | |
"fmt" | |
"time" | |
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | |
"k8s.io/client-go/kubernetes" | |
"k8s.io/client-go/rest" | |
) | |
func main() {config, err := rest.InClusterConfig() | |
if err != nil {panic(err.Error()) | |
} | |
clientset, err := kubernetes.NewForConfig(config) | |
if err != nil {panic(err.Error()) | |
} | |
for {pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{}) | |
if err != nil {panic(err.Error()) | |
} | |
for _, pod := range pods.Items {fmt.Printf("命名空间:%s POD 名称:%s\n", pod.Namespace, pod.Name) | |
} | |
fmt.Printf("集群中有 %d 个 pod", len(pods.Items)) | |
time.Sleep(10 * time.Second) | |
} | |
} |
须要留神的事件,看这段代码的 InClusterConfig 函数,记得上次对它剖析过:
config, err := rest.InClusterConfig() | |
if err != nil {panic(err.Error()) | |
} |
这段代码应用 rest.InClusterConfig() 函数获取以后运行环境下的 Kubernetes 集群的配置。如果获取配置时产生谬误,通过 panic 抛出异样。
不信的话,编译后运行试试:
[root@workhost in-cluster-client-configuration]# ./app | |
panic: unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined | |
goroutine 1 [running]: | |
main.main() | |
/root/project/gocode/src/in-cluster-client-configuration/main.go:17 +0x314 |
报错了。要解决这个问题,就是要将这个应用程序在 POD 内运行。
提醒:报错的根本原因是因为这两个自定义变量是由 K8S 本身治理且定义在了 POD 里的容器内,只有将这个示例利用运行在 POD 里的容器能力正确加载自定义变量。
编译应用程序
[root@workhost src]# cd in-cluster-client-configuration/ | |
[root@workhost in-cluster-client-configuration]# go mod init | |
go: creating new go.mod: module in-cluster-client-configuration | |
go: to add module requirements and sums: | |
go mod tidy | |
[root@workhost in-cluster-client-configuration]# go mod tidy | |
[root@workhost in-cluster-client-configuration]# GOOS=linux go build -o ./app . |
- GOOS=linux:这将 GOOS 环境变量设置为 linux,示意专门为 Linux 构建应用程序。
- go build:这是 Go 语言的编译命令,用于编译 Go 源代码并生成可执行文件。
- -o ./app:这是一个选项,指定编译输入的可执行文件的名称和门路。在这个命令中,- o 示意指定输入文件,./app 示意输入文件的门路和名称为当前目录下的 app。
- .:这是命令的最初一个参数,示意当前目录中的 Go 源代码文件。这通知编译器从当前目录中的所有 Go 源文件中构建应用程序。
编译后:
[root@workhost in-cluster-client-configuration]# ls -l | |
total 43928 | |
-rwxr-xr-x. 1 root root 44919028 May 23 08:59 app # 编译后失去的可执行二进制文件 | |
-rw-r--r--. 1 root root 44 May 23 08:56 Dockerfile | |
-rw-r--r--. 1 root root 1909 May 23 08:59 go.mod | |
-rw-r--r--. 1 root root 47303 May 23 08:59 go.sum | |
-rw-r--r--. 1 root root 1750 May 23 08:57 main.go |
制作镜像
Dockerfile 内容:
FROM debian | |
COPY ./app /app | |
ENTRYPOINT /app |
构建镜像和推送到公有仓库:
docker build -t 192.168.11.254:8081/library/example-app:v1 . | |
docker push 192.168.11.254:8081/library/example-app:v1 |
在 K8S 运行
[root@k8s-b-master ~]# kubectl run --rm -i example-pod --image=192.168.11.254:8081/library/example-app:v1 | |
pod "example-pod" deleted | |
error: timed out waiting for the condition |
竟然超时了,没有获取到 POD。官网示例中提到,如果在 K8S 集群上启用了 RBAC,就须要创立角色绑定。就此看来是因为权限问题导致。那先确定一下 k8s 集群是否启用了 RBAC:
[root@k8s-b-master kubernetes]# kubectl api-versions | grep rbac | |
rbac.authorization.k8s.io/v1 | |
[root@k8s-b-master kubernetes]# kubectl get roles,rolebindings --all-namespaces | |
NAMESPACE NAME CREATED AT | |
kube-public role.rbac.authorization.k8s.io/kubeadm:bootstrap-signer-clusterinfo 2023-04-30T03:23:50Z | |
kube-public role.rbac.authorization.k8s.io/system:controller:bootstrap-signer 2023-04-30T03:23:48Z | |
kube-system role.rbac.authorization.k8s.io/extension-apiserver-authentication-reader 2023-04-30T03:23:48Z | |
... |
这些输入提供了与 RBAC 受权相干的信息,包含可用的 API 版本以及集群中的角色和角色绑定配置,所以是启用了 RBAC 的。
留神:如果是应用 kubeadm 搭建的 k8s 集群,那么 rbac 默认都是启用的。如果是二进制搭建的,那就不肯定了,这将取决于您的配置和部署抉择。
接下来,创立一个名为 ”default-view” 的 ClusterRoleBinding:
kubectl create clusterrolebinding default-view --clusterrole=view --serviceaccount=default:default
- default-view:ClusterRoleBinding 的名称。在这个例子中,ClusterRoleBinding 将被命名为 ”default-view”。
- –clusterrole=view:选项,指定要绑定的 ClusterRole。这里指定了 ”view” ClusterRole,它具备查看(view)集群资源的权限。ClusterRole 是一组权限的汇合,能够授予用户、组或服务账号特定的权限。
- –serviceaccount=default:default:选项,指定要绑定到 ClusterRole 的 ServiceAccount。这里指定了 ”default:default”,示意将 ”default” 命名空间下的 ”default” ServiceAccount 与 ClusterRole 进行绑定。
总之,这个命令将创立一个名为 ”default-view” 的 ClusterRoleBinding,将 ”default” 命名空间下的 ”default” ServiceAccount 与 ”view” ClusterRole 进行绑定。这意味着 ”default” ServiceAccount 将具备查看集群资源的权限。这能够用于授予特定的 ServiceAccount 对集群资源的只读拜访权限,而无需授予其余更高级的权限。
创立完角色绑定后持续运行:
[root@k8s-b-master ~]# kubectl run --rm -i example-pod --image=192.168.11.254:8081/library/example-app:v1 | |
If you don't see a command prompt, try pressing enter. | |
命名空间:default POD 名称:example-pod | |
命名空间:default POD 名称:goweb-7db674b88c-d544x | |
命名空间:default POD 名称:goweb-7db674b88c-j5hd6 | |
命名空间:default POD 名称:goweb-7db674b88c-v2z5r | |
命名空间:default POD 名称:nginx | |
命名空间:kube-system POD 名称:calico-kube-controllers-567c56ff98-pb4dj | |
命名空间:kube-system POD 名称:calico-node-7kqhw | |
命名空间:kube-system POD 名称:calico-node-hbbs4 | |
命名空间:kube-system POD 名称:calico-node-pngws | |
命名空间:kube-system POD 名称:calico-node-r8vp9 | |
命名空间:kube-system POD 名称:calico-node-sfws4 | |
命名空间:kube-system POD 名称:calico-node-skktr | |
命名空间:kube-system POD 名称:calico-node-wm2lt | |
命名空间:kube-system POD 名称:coredns-c676cc86f-lkw8r | |
命名空间:kube-system POD 名称:coredns-c676cc86f-ncnnn | |
命名空间:kube-system POD 名称:etcd-k8s-b-master | |
命名空间:kube-system POD 名称:kube-apiserver-k8s-b-master | |
命名空间:kube-system POD 名称:kube-controller-manager-k8s-b-master | |
命名空间:kube-system POD 名称:kube-proxy-8hw4f | |
命名空间:kube-system POD 名称:kube-proxy-9qsc8 | |
命名空间:kube-system POD 名称:kube-proxy-b4vjj | |
命名空间:kube-system POD 名称:kube-proxy-d7lh9 | |
命名空间:kube-system POD 名称:kube-proxy-nmdxd | |
命名空间:kube-system POD 名称:kube-proxy-ql2kf | |
命名空间:kube-system POD 名称:kube-proxy-stfff | |
命名空间:kube-system POD 名称:kube-scheduler-k8s-b-master | |
集群中有 26 个 pod 命名空间:default POD 名称:example-pod | |
命名空间:default POD 名称:goweb-7db674b88c-d544x | |
命名空间:default POD 名称:goweb-7db674b88c-j5hd6 | |
命名空间:default POD 名称:goweb-7db674b88c-v2z5r | |
命名空间:default POD 名称:nginx | |
命名空间:kube-system POD 名称:calico-kube-controllers-567c56ff98-pb4dj | |
命名空间:kube-system POD 名称:calico-node-7kqhw | |
命名空间:kube-system POD 名称:calico-node-hbbs4 | |
命名空间:kube-system POD 名称:calico-node-pngws | |
命名空间:kube-system POD 名称:calico-node-r8vp9 | |
命名空间:kube-system POD 名称:calico-node-sfws4 | |
命名空间:kube-system POD 名称:calico-node-skktr | |
命名空间:kube-system POD 名称:calico-node-wm2lt | |
命名空间:kube-system POD 名称:coredns-c676cc86f-lkw8r | |
命名空间:kube-system POD 名称:coredns-c676cc86f-ncnnn | |
命名空间:kube-system POD 名称:etcd-k8s-b-master | |
命名空间:kube-system POD 名称:kube-apiserver-k8s-b-master | |
命名空间:kube-system POD 名称:kube-controller-manager-k8s-b-master | |
命名空间:kube-system POD 名称:kube-proxy-8hw4f | |
命名空间:kube-system POD 名称:kube-proxy-9qsc8 | |
命名空间:kube-system POD 名称:kube-proxy-b4vjj | |
命名空间:kube-system POD 名称:kube-proxy-d7lh9 | |
命名空间:kube-system POD 名称:kube-proxy-nmdxd | |
命名空间:kube-system POD 名称:kube-proxy-ql2kf | |
命名空间:kube-system POD 名称:kube-proxy-stfff | |
命名空间:kube-system POD 名称:kube-scheduler-k8s-b-master | |
集群中有 26 个 pod 命名空间:default POD 名称:example-pod | |
命名空间:default POD 名称:goweb-7db674b88c-d544x | |
命名空间:default POD 名称:goweb-7db674b88c-j5hd6 | |
命名空间:default POD 名称:goweb-7db674b88c-v2z5r | |
命名空间:default POD 名称:nginx | |
命名空间:kube-system POD 名称:calico-kube-controllers-567c56ff98-pb4dj | |
命名空间:kube-system POD 名称:calico-node-7kqhw | |
命名空间:kube-system POD 名称:calico-node-hbbs4 | |
命名空间:kube-system POD 名称:calico-node-pngws | |
命名空间:kube-system POD 名称:calico-node-r8vp9 | |
命名空间:kube-system POD 名称:calico-node-sfws4 | |
命名空间:kube-system POD 名称:calico-node-skktr | |
命名空间:kube-system POD 名称:calico-node-wm2lt | |
命名空间:kube-system POD 名称:coredns-c676cc86f-lkw8r | |
命名空间:kube-system POD 名称:coredns-c676cc86f-ncnnn | |
命名空间:kube-system POD 名称:etcd-k8s-b-master | |
命名空间:kube-system POD 名称:kube-apiserver-k8s-b-master | |
命名空间:kube-system POD 名称:kube-controller-manager-k8s-b-master | |
命名空间:kube-system POD 名称:kube-proxy-8hw4f | |
命名空间:kube-system POD 名称:kube-proxy-9qsc8 | |
命名空间:kube-system POD 名称:kube-proxy-b4vjj | |
命名空间:kube-system POD 名称:kube-proxy-d7lh9 | |
命名空间:kube-system POD 名称:kube-proxy-nmdxd | |
命名空间:kube-system POD 名称:kube-proxy-ql2kf | |
命名空间:kube-system POD 名称:kube-proxy-stfff | |
命名空间:kube-system POD 名称:kube-scheduler-k8s-b-master | |
集群中有 26 个 pod | |
... | |
... | |
... |
本文转载于 WX 公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/N3ArZ-T62yUZClf2UN5Qrg