一、k8ssvc網路模式
1、ClusterIP模式
ClusterIP模式是k8ssvc最常用的網路模式,它可以將一組Pod通過一個虛擬的ClusterIP暴露出來,用戶只需要訪問該ClusterIP就可以訪問到整個Pod組,該模式適用於內部服務之間的調用以及對外暴露服務的場景。
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - name: http port: 80 targetPort: http
以上代碼演示了ClusterIP模式的使用,其中name為該Service的名稱,selector為該Service所關聯的Pod的標識符,ports為該Service暴露出來的埠號及對應的Pod埠號。
2、NodePort模式
NodePort模式是k8ssvc將Pod暴露給集群外部的一種方式,相當於在每個Node上開放一個埠,但通常會結合LoadBalancer進行使用,用於將集群外部的請求轉發到NodePort上,由NodePort再轉發到Pod。
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - name: http port: 80 targetPort: http type: NodePort
以上代碼演示了NodePort模式的使用,其中type為該Service的類型,指定為NodePort即可使用該模式。
3、LoadBalancer模式
LoadBalancer模式是在NodePort模式的基礎上增加了一層負載均衡,能夠將NodePort上的請求進行負載均衡分發到多個Pod上,相比NodePort模式更具有擴展性。
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - name: http port: 80 targetPort: http type: LoadBalancer
以上代碼演示了LoadBalancer模式的使用,其中type為該Service的類型,指定為LoadBalancer即可使用該模式。
二、k8ssvc域名解析失敗
1、檢查dns配置
在kubernetes集群中,每個Pod都有一個默認的DNS配置文件(/etc/resolv.conf),該文件中會包含兩個默認的nameserver,這些nameserver會用來解析所有的域名。在有些場景下,這些nameserver可能無法解析一些特殊的域名,因此我們可以在Pod的配置文件中手動設置dnsPolicy參數以使用自定義的DNS配置。
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image dnsPolicy: "None" dnsConfig: nameservers: - 8.8.8.8 #使用谷歌公共DNS解析
2、使用Service名稱作為域名
k8ssvc中,每個Service都有一個DNS記錄,該DNS記錄可以直接通過Service的名稱進行訪問。例如,我們有一個名為my-service的Service,可以通過my-service命名空間進行訪問。如果是在同一命名空間中,則可以直接使用my-service進行訪問。
http://my-service:80
3、使用Pod名稱作為域名
在kubernetes集群中,每個Pod都有一個唯一的名稱,該名稱可以直接作為域名進行訪問。例如,我們有一個名為my-pod的Pod,可以使用my-pod命名空間進行訪問。如果是在同一命名空間中,則可以直接使用my-pod進行訪問。
http://my-pod:80
三、k8ssvc的負載均衡策略
1、RoundRobin策略
RoundRobin策略是k8ssvc默認的負載均衡策略,它會將請求平均分配到所有的Pod上,遵循先到先服務的原則。
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - name: http port: 80 targetPort: http sessionAffinity: None #不開啟SessionAffinity即為默認的RoundRobin策略
2、IPHash策略
IPHash策略會基於請求的源IP進行Hash操作,將同一IP的請求分發到同一個Pod上。
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - name: http port: 80 targetPort: http sessionAffinity: ClientIP #開啟SessionAffinity即為IPHash策略
3、Random策略
Random策略會隨機選擇一個Pod進行響應,可以用於某些場景下對請求的延遲和性能要求不高的服務。
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - name: http port: 80 targetPort: http sessionAffinity: None type: LoadBalancer #需要結合LoadBalancer模式使用
四、k8ssvc的安全設置
1、使用Service Account授權
在kubernetes中,每個Pod都會自動關聯一個Service Account,用於與kubernetes API Server進行交互。我們可以通過為Service Account分配RBAC角色來限制該Service Account的許可權。
apiVersion: v1 kind: Pod metadata: name: my-pod spec: serviceAccountName: my-serviceaccount containers: - name: my-container image: my-image
2、使用kubeconfig文件授權
使用kubeconfig文件可以為Service Account或某個用戶分配一組認證信息,在訪問kubernetes API Server時需要提供這組認證信息。
apiVersion: v1 kind: Config users: - name: my-user user: client-certificate: /path/to/my-cert.pem #客戶端證書 client-key: /path/to/my-key.pem #客戶端私鑰 clusters: - name: my-cluster cluster: certificate-authority: /path/to/ca.pem #CA證書 server: "https://my-server:6443" #kubernetes API Server地址 contexts: - name: my-context context: user: my-user #關聯用戶 cluster: my-cluster #關聯集群 current-context: my-context #設置當前上下文
3、設置安全策略
使用PodSecurityPolicy可以限制Pod的許可權,包括容器的許可權、存儲卷的使用等。通過為kubernetes集群中的Pod分配相應的PodSecurityPolicy,可以在一定程度上提高安全性。
apiVersion: extensions/v1beta1 kind: PodSecurityPolicy metadata: name: my-psp spec: privileged: false allowedCapabilities: - NET_ADMIN seLinux: rule: # 禁止訪問系統文件等 volumes: - configMap - emptyDir - secret
總結
通過以上對於kubernetes service(k8ssvc)的詳細解析,可以更好地理解k8ssvc的網路模式、域名解析、負載均衡策略以及安全設置等方面的應用場景及使用方法。在實際使用kubernetes進行開發時,我們需要根據具體的業務需求來選擇合適的網路模式、負載均衡策略以及安全措施,以保證應用程序的高可用性、高性能及安全性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/242930.html