k8ssvc——kubernetes service的使用詳解

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:53
下一篇 2024-12-12 12:53

相關推薦

  • Kubernetes安裝Drone教程

    本文將通過多個方面詳細介紹如何在Kubernetes中安裝Drone,讓您快速上手使用。 一、前置條件 1、已經安裝了Kubernetes環境 2、擁有一個Github賬戶 3、已…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和演算法 C語言貪吃蛇主要運用了以下數據結構和演算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25

發表回復

登錄後才能評論