另辟蹊徑打入kubernetes網絡內訪問服務


        我們知道kubernetes外部訪問服務只有四種:port-forward、Ingress、LoadBalancer、NodePort,那有沒有一種直接進入到集群內訪問服務?當然有,這里為大家提供一個思路及一個方法,大家可以嘗試做做,該方法可以為你的工作提效。

        我們知道kubernetes外部訪問服務只有四種:port-forward、Ingress、LoadBalancer、NodePort,那有沒有一種直接進入到集群內訪問服務?當然有,這里為大家提供一個思路及一個方法,大家可以嘗試玩玩,該方法可以為你的工作提效。

        場景一:大家在k8s中是不是遇到,想到群集的應用導入數據時,發該服務沒有暴露端口,想要導數據得先將服務暴露出來,這時需要先在k8s里創建LoadBalancer或NodePort,或者將原來ClusterIP改為LoadBalancer或NodePort才可以外部訪問,或者使用port-forward。ingress這時更不好實現,ingress本身就是一個LoadBalancer,對TCP和UDP實現比較麻煩,端口多的時候無法招架。

image

 

image

 

        場景二:我們想知道k8s集群內部各容器是否互訪及內部域名是否互通,通常的做法是進入pod里面去ping、curl等操作,比較麻煩。

 

        說明一下:場景一是外部訪問問題,場景二是集群內部之間訪問問題。

 

        這種場景我是怎么解決的呢,思路很簡單,就是將集群的流量代理出來,如http、vpn、socks等,這里舉一個非常實用且簡單的方法:跑一個能連sshd的pod就可以了。注意:使用sshd代理上網可能會遇到證書問題,所以大家不要用來代理上網。

 

ssh.yaml

 1 apiVersion: apps/v1
 2 kind: Deployment
 3 metadata:
 4   name: ssh
 5   namespace: javalittleman
 6 #  labels:
 7 #    app: ssh
 8 spec:
 9   replicas: 1
10   template:
11     metadata:
12       labels:
13         app: ssh
14     spec:
15       containers:
16         - name: ssh
17           image: panubo/sshd
18           env:
19             - name: SSH_ENABLE_ROOT
20               value: "true"
21             - name: SSH_ENABLE_PASSWORD_AUTH
22               value: "true"
23             - name: MOTD
24               value: "歡迎登錄"
25 #            - name: DISABLE_SFTP
26 #              value: "false"
27             - name: SSH_USERS
28               value: "userr:1000:1000,admin:48:48,root"
29             - name: GATEWAY_PORTS
30               value: "true"
31             - name: TCP_FORWARDING
32               value: "true"
33 #            - name: SFTP_MODE
34 #              value: "true"
35 #            - name: SFTP_CHROOT
36 #              value: "/data"
37 #            - name: SCP_MODE
38 #              value: "true"
39 #            - name: RSYNC_MODE
40 #              value: "true"
41           ports:
42             - containerPort: 22
43               protocol: TCP
44 #          tty: true
45           volumeMounts:
46             - mountPath: /etc/entrypoint.d/
47               name: ssh-storage
48               subPath: entrypoint.d
49             - mountPath: /root/.ssh/
50               name: ssh-storage
51               subPath: .ssh
52 #            - mountPath: /etc/ssh/keys
53 #              name: ssh-storage
54 #              subPath: keys
55             - mountPath: /data
56               name: ssh-storage
57               subPath: data
58             - mountPath: /etc/ssh/
59               name: ssh-storage
60               subPath: ssh
61       volumes:
62         - name: ssh-storage
63           persistentVolumeClaim:
64             claimName: ssh-pvc
65   selector:
66     matchLabels:
67       app: ssh
68 ---
69 apiVersion: v1
70 kind: Service
71 metadata:
72   namespace: javalittleman
73   name: ssh
74   labels:
75     app: ssh
76 spec:
77   type: LoadBalancer
78   ports:
79     - port: 22
80       targetPort: 22
81       protocol: TCP
82   selector:
83     app: ssh
84 
85 ---
86 apiVersion: v1
87 kind: PersistentVolumeClaim
88 metadata:
89   name: ssh-pvc
90   namespace: javalittleman
91 spec:
92 #  storageClassName: nfs-client-provisioner1
93   accessModes:
94     - ReadWriteMany
95   resources:
96     requests:
97       storage: 1Mi

 

  以上yaml自己根據自己的情況去配置,我這里使用了存儲、LoadBalancer,這些先要准備好

  這個腳本我加了一個對xshell兼容的代碼,至於用戶密碼你可以選擇密文或者明文都可以了,這個腳本是放在/etc/entrypoint.d/下的,需要對此加可執行權限chmod。

setpasswd.sh

 1 #!/usr/bin/env bash
 2 
 3 set -e
 4 #docker run --rm -it --entrypoint /usr/bin/env docker.io/panubo/sshd:1.3.0 mkpasswd
 5 #echo 'root:$6$1yzDg4xFmQMecjlV$ddBMEcWZaHGkyki1aJ67ZavSOJaPVXj8v03PQc5n08Pb6ilplthzrBr/prmcEJ5uplaIvgtMpzDF0pijtCEi01' | chpasswd --encrypted
 6 
 7 # Or if you don't pre-hash the password remove the line above and uncomment the line below.
 8  echo "userr:userrpassword" | chpasswd
 9  echo "admin:adminpassword" | chpasswd
10 
11 # 解決xshell報錯:服務器發送了一個意外的數據包。received:3,expected:20
12 
13 sshd_config=/etc/ssh/sshd_config
14 findstr='KexAlgorithms1'
15 
16 if  [ `grep -c $findstr $sshd_config` -eq '0' ]; then
17   echo "KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1" >> /etc/ssh/sshd_config
18 else
19   echo "已經存在"
20 fi

 

 

image

 

image

 

效果如下:

image

 

先講場景二:可以直接在這里ping服務名,如果要跨namespace訪問,就可以通過k8s的訪問規則去嘗試訪問,如果訪問不了,就證明該服務有問題。

 

image

場景一:接下來就是要把這個192.168.109.125的流量代理出來,這樣就可以像把電腦搬到k8s內部網絡里訪問服務了。下圖是通過xshell的隧道方式實現socks代理,當然大家可以使用其它工具。

image

IE代理設置,使用socks5(套節字),當然你可以使用chrome,chrome需要安裝插件。

image

 

 

我們來試試如果訪問,其它服務這里就不列舉了:

直接訪問k8s內部IP:如訪問Kunsul

image

image

 

 

通過navicat查詢或導入導出數據

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM