一、準備工作
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