我們知道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實現比較麻煩,端口多的時候無法招架。
場景二:我們想知道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
效果如下:
先講場景二:可以直接在這里ping服務名,如果要跨namespace訪問,就可以通過k8s的訪問規則去嘗試訪問,如果訪問不了,就證明該服務有問題。
場景一:接下來就是要把這個192.168.109.125的流量代理出來,這樣就可以像把電腦搬到k8s內部網絡里訪問服務了。下圖是通過xshell的隧道方式實現socks代理,當然大家可以使用其它工具。
IE代理設置,使用socks5(套節字),當然你可以使用chrome,chrome需要安裝插件。
我們來試試如果訪問,其它服務這里就不列舉了:
直接訪問k8s內部IP:如訪問Kunsul
通過navicat查詢或導入導出數據