如何實現k8s的服務發現與註冊?

一、準備工作

1、在部署k8s集群的時候需要使用kubectl命令

2、需要提前安裝etcd服務

3、在k8s中,使用的是CoreDNS作為服務發現組件,所以需要安裝配置好CoreDNS

4、在k8s中,使用的是kube-proxy作為負載均衡的組件,因此需要安裝好kube-proxy

二、k8s的服務發現與註冊實現

1、基礎概念

在k8s中,每個Pod都會分配一個IP地址,這個IP地址只在集群內有效,而外部無法訪問。因此,需要一種機制來讓服務可以被其他組件(如其他Pod)找到並進行訪問。k8s提供了一種服務發現的機制,可以通過服務名(Service)來訪問服務,並將請求負載均衡到後端的Pod中。

2、Service的實現

使用kubectl命令創建一個Service:

kubectl expose deployment hello-world --type=LoadBalancer --name=my-service

這個命令會在k8s中創建一個Service,並將它映射到名為`my-service`的Service中。

3、Service的工作機制

創建Service後,Service會綁定一個IP地址,並將指定的Pod加入Service中。當有請求發送到Service的IP地址時,Service會將請求轉發給其中的某個Pod。具體選擇哪個Pod來處理請求,是根據Service的負載均衡策略決定的。

4、Service的高級用法

除了簡單地將Pod組合成一個Service外,還可以對Service進行更多的配置,以滿足不同的業務需求。

5、使用CoreDNS來進行服務發現

k8s提供了一個DNS服務,用於將服務名解析為Service的IP地址,從而實現服務發現。在k8s中,使用的是CoreDNS來實現服務發現。CoreDNS是一種輕量級的DNS服務器,可以在k8s中進行部署。在集群中啟動CoreDNS後,所有的客戶端(如Pod)都可以使用CoreDNS對服務名進行解析。

CoreDNS的配置文件如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            upstream
            fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        reload
        loadbalance
    }

6、使用kube-proxy進行負載均衡

k8s中的服務發現機制並沒有直接對請求進行負載均衡,而是將負載均衡交給了kube-proxy組件來處理。因此,當有請求發送到Service的IP地址時,kube-proxy會根據Service的負載均衡策略,選擇其中的某個Pod來處理請求,並將請求轉發給該Pod。

7、示例代碼

下面是使用Go語言編寫的一個簡單的微服務應用:

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
		fmt.Fprintf(w, "Hello World!\n")
	})

	http.ListenAndServe(":8080", nil)
}

下面是使用Dockerfile將上述應用打包成Docker鏡像:

FROM golang:alpine AS build

RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN go build -o main .

FROM alpine
RUN apk add --no-cache curl
COPY --from=build /app/main /app/main
EXPOSE 8080
CMD ["/app/main"]

使用kubectl部署上述Docker鏡像:

kubectl apply -f deployment.yaml

下面是部署文件deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      app: hello-world
  replicas: 3
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: myuser/hello-world:v1
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: hello-world-service
spec:
  selector:
    app: hello-world
  ports:
  - name: http
    port: 80
    targetPort: 8080
  type: LoadBalancer

8、參考資料

1、官方文檔:https://kubernetes.io/docs/home/

2、CoreDNS:https://coredns.io/

3、kube-proxy:https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/188627.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-28 13:32
下一篇 2024-11-28 13:32

相關推薦

  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • Django ORM如何實現或的條件查詢

    在我們使用Django進行數據庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • Python一次性輸入10個數如何實現?

    Python提供了多種方法進行輸入,可以手動逐個輸入,也可以一次性輸入多個數。在需要輸入大量數據時,一次性輸入十個數就非常方便。下面我們從多個方面來講解如何一次性輸入10個數。 一…

    編程 2025-04-28
  • 如何實現van-picker點擊遮罩不關閉

    van-picker是一個非常實用的Vue組件,但默認情況下,點擊遮罩會自動關閉選擇器。本文將介紹如何通過代碼實現van-picker點擊遮罩不關閉的功能。 一、通過覆蓋遮罩實現 …

    編程 2025-04-27
  • 如何實現矩陣相乘等於E

    本文將介紹如何通過代碼實現兩個矩陣相乘等於單位矩陣E。 一、線性代數基礎 要理解矩陣相乘等於E,需要先了解一些線性代數基礎知識。 首先,矩陣的乘法是滿足結合律的,即(A*B)*C=…

    編程 2025-04-27
  • 如何解決Docker+k8s報錯413 Request Entity Too Large

    對於使用Docker容器和Kubernetes集群的開發人員,在處理HTTP請求時,常常會遇到413 Request Entity Too Large的報錯。這通常是由於請求的大小…

    編程 2025-04-27
  • k8s節點設置cpu高於多少就不調度

    本文將從以下幾個方面詳細闡述k8s節點設置cpu高於多少就不調度的相關內容: 一、k8s節點設置的概念和原理 k8s是Google開源的容器集群管理系統,用於自動化部署、擴展和管理…

    編程 2025-04-27
  • 如何實現一個隨機抽數生成器

    隨機數在程序開發中是非常常見的需求,而隨機抽數生成器則是其一大應用場景。在這篇文章中,我們將從多個方面來探討如何實現一個隨機抽數生成器,包括隨機數的概念、生成隨機數的方法、如何抽取…

    編程 2025-04-27
  • K8s環境部署及管理指南

    一、K8s環境介紹 K8s是目前最受歡迎的容器編排平台,可以很好地管理和調度容器,實現應用的高可用。K8s環境包含了多個組件,包括etcd、kube-apiserver、kube-…

    編程 2025-04-25
  • 使用Kubernetes(K8s)搭建分布式系統

    一、Kubernetes概述 Kubernetes是一個用於自動部署、擴展和管理容器化應用程序的開源平台。其提供了高可用性、自我修復能力和易於擴展的特徵,使得大規模、高度可用的分布…

    編程 2025-04-24

發表回復

登錄後才能評論