# Kube-proxy ![image](./img/09_cluster_architecture_proxy.png "Kubelet") такс, ```bash { cat < nginx-deployment.yml apiVersion: v1 kind: ConfigMap metadata: name: nginx-conf data: default.conf: | server { listen 80; server_name _; location / { return 200 "Hello from pod: \$hostname\n"; } } --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.21.3 ports: - containerPort: 80 volumeMounts: - name: nginx-conf mountPath: /etc/nginx/conf.d volumes: - name: nginx-conf configMap: name: nginx-conf EOF kubectl apply -f nginx-deployment.yml } ``` ```bash kubectl get pod -o wide ``` Output: ``` NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-db9778f94-2zv7x 1/1 Running 0 63s 10.240.1.12 example-server nginx-deployment-db9778f94-q5jx4 1/1 Running 0 63s 10.240.1.10 example-server nginx-deployment-db9778f94-twx78 1/1 Running 0 63s 10.240.1.11 example-server ``` now, we will run busybox container and will try to access our pods from other container ```bash { cat < pod.yaml apiVersion: v1 kind: Pod metadata: name: busy-box spec: containers: - name: busy-box image: busybox command: ['sh', '-c', 'while true; do echo "Busy"; sleep 1; done'] EOF kubectl apply -f pod.yaml } ``` and execute command from our container ```bash kubectl exec busy-box -- wget -O - $(kubectl get pod -o wide | grep nginx | awk '{print $6}' | head -n 1) ``` Output: ``` error: unable to upgrade connection: Forbidden (user=kubernetes, verb=create, resource=nodes, subresource=proxy) ``` error occured because api server has no access to execute commands ```bash { cat < rbac-create.yml kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: kubernetes-user-clusterrole rules: - apiGroups: [""] resources: ["nodes/proxy"] verbs: ["create"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: kubernetes-user-clusterrolebinding subjects: - kind: User name: kubernetes apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: kubernetes-user-clusterrole apiGroup: rbac.authorization.k8s.io EOF kubectl apply -f rbac-create.yml } ``` and execute command from our container ```bash kubectl exec busy-box -- wget -O - $(kubectl get pod -o wide | grep nginx | awk '{print $6}' | head -n 1) ``` Output: ``` Hello from pod: nginx-deployment-68b9c94586-qkwjc Connecting to 10.32.0.230 (10.32.0.230:80) writing to stdout - 100% |********************************| 50 0:00:00 ETA written to stdout ``` it is not very interesting to access pods by ip, we want to have some automatic load balancing we know that services may help us with that ```bash { cat < nginx-service.yml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 EOF kubectl apply -f nginx-service.yml } ``` get our server ```bash kubectl get service ``` and try to ping our containers by service ip ```bash kubectl exec busy-box -- wget -O - $(kubectl get service -o wide | grep nginx | awk '{print $3}') ``` Output: ``` Connecting to 10.32.0.230 (10.32.0.230:80) ``` hm, nothing happen, the reason - our cluster do not know how to connect to service ip this is responsibiltiy of kube-proxy it means that we need to configure kube-proxy as usually we will start with certs ```bash { cat > kube-proxy-csr.json <