輿情信息網(wǎng)站微信營(yíng)銷怎么做
引言
最近在自己電腦上搭建一個(gè)小型k8s環(huán)境,以學(xué)習(xí)云原生相關(guān)內(nèi)容。這里我主要分為三部分記錄:
- 容器及容器編排理論
- 環(huán)境安裝相關(guān)
- rpcx服務(wù)實(shí)戰(zhàn)
還在調(diào)試中,先總結(jié)整理下,這里后續(xù)補(bǔ)充上我的github工程鏈接。
一、容器及容器編排理論
容器技術(shù)中有三個(gè)核心概念:容器(Container)、鏡像(Image),以及鏡像倉(cāng)庫(kù)(Registry)
如何通過Docker File構(gòu)建鏡像?
=> 首先編寫Docker File文件, Docker build 命令構(gòu)建鏡像 ,Docker run 依照新編寫好的鏡像運(yùn)行容器實(shí)例。
操作容器的常用命令有 docker ps、docker run、docker exec、docker stop
等;操作鏡像的常用命令有 docker images、docker rmi、docker build、docker tag
等;操作鏡像倉(cāng)庫(kù)的常用命令有 docker pull、docker push
等。
Kubernetes 就是一個(gè)生產(chǎn)級(jí)別的容器編排平臺(tái)和集群管理系統(tǒng),不僅能夠創(chuàng)建、調(diào)度容器,還能夠監(jiān)控、管理服務(wù)器。
快速搭建 Kubernetes 環(huán)境的工具選擇minikube, 最大特點(diǎn)就是“小而美”,可執(zhí)行文件僅有不到 100MB,運(yùn)行鏡像也不過 1GB,但就在這么小的空間里卻集成了 Kubernetes 的絕大多數(shù)功能特性,不僅有核心的容器編排功能,還有豐富的插件,例如 Dashboard、GPU、Ingress、Istio、Kong、Registry 等等,綜合來看非常完善。
總結(jié)差異:
容器技術(shù)只解決了應(yīng)用的打包、安裝問題,面對(duì)復(fù)雜的生產(chǎn)環(huán)境就束手無策了,解決之道就是容器編排,它能夠組織管理各個(gè)應(yīng)用容器之間的關(guān)系,讓它們順利地協(xié)同運(yùn)行。
Kubernetes 源自 Google 內(nèi)部的 Borg 系統(tǒng),也是當(dāng)前容器編排領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。minikube 可以在本機(jī)搭建 Kubernetes 環(huán)境,功能很完善,適合學(xué)習(xí)研究。操作 Kubernetes 需要使用命令行工具 kubectl,只有通過它才能與 Kubernetes 集群交互。kubectl 的用法與 docker 類似,也可以拉取鏡像運(yùn)行,但操作的不是簡(jiǎn)單的容器。
docker和k8s之間的區(qū)別,一個(gè)是容器技術(shù),一個(gè)是容器編排技術(shù),兩者思考的維度是不一樣的,就容器而言,容器解決的問題是隔離,是一次打包到處運(yùn)行的問題,最大的價(jià)值就在于鏡像的遷移。編排技術(shù)則是關(guān)注的是整個(gè)系統(tǒng)的問題,如果你只關(guān)注一個(gè)服務(wù),遷移一個(gè)服務(wù),那docker就夠,但要遷移整個(gè)系統(tǒng)以及運(yùn)維,那就需要編排,包括網(wǎng)絡(luò)關(guān)系,負(fù)載均衡,回滾,監(jiān)控,擴(kuò)縮容問題則需要容器編排技術(shù)。
二、環(huán)境安裝相關(guān)
我的電腦是mac m2,因此需要安裝一些arm架構(gòu)的軟件。首先安裝docker,主要使用的命令記錄:
因?yàn)榘惭b的是docker 桌面版本,終端可能找不到docker命令,因此添加環(huán)境變量:
export PATH="$PATH:/Applications/Docker.app/Contents/Resources/bin/"驗(yàn)證:
docker --version
之后安裝minikube,這里使用命令行安裝arm架構(gòu)版本:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
sudo install minikube-darwin-arm64 /usr/local/bin/minikube驗(yàn)證:
minikube version
不過 minikube 只能夠搭建 Kubernetes 環(huán)境,要操作 Kubernetes,還需要另一個(gè)專門的客戶端工具“kubectl”。kubectl 的作用有點(diǎn)類似之前我們學(xué)習(xí)容器技術(shù)時(shí)候的工具“docker”,它也是一個(gè)命令行工具,作用也比較類似,同樣是與 Kubernetes 后臺(tái)服務(wù)通信,把我們的命令轉(zhuǎn)發(fā)給 Kubernetes,實(shí)現(xiàn)容器和集群的管理功能。
minikube kubectlminikube dashboard此時(shí)可以界面化查看: http://127.0.0.1:52337/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/pod?namespace=default
? k8s minikube version
minikube version: v1.32.0
commit: 8220a6eb95f0a4d75f7f2d7b14cef975f050512d
? k8s minikube kubectl – version
Client Version: v1.28.3
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.3
三、rpcx服務(wù)實(shí)戰(zhàn)
RPCX
是一個(gè)分布式的Go語言的 RPC 框架,支持Zookepper、etcd、consul多種服務(wù)發(fā)現(xiàn)方式,多種服務(wù)路由方式,這里首先基于該框架在本機(jī)測(cè)試代碼,之后開始考慮生成鏡像并本地部署。
3.1 本地運(yùn)行及測(cè)試服務(wù)代碼
服務(wù)端rpcx_server.go代碼:
package mainimport ("context""flag""log""time"example "github.com/rpcxio/rpcx-examples""github.com/smallnest/rpcx/client"
)var (addr = flag.String("addr", "localhost:8972", "server address")
)func main() {flag.Parse()d, _ := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)defer xclient.Close()args := &example.Args{A: 10,B: 20,}for {reply := &example.Reply{}err := xclient.Call(context.Background(), "Mul", args, reply)if err != nil {log.Fatalf("failed to call: %v", err)}log.Printf("%d * %d = %d", args.A, args.B, reply.C)time.Sleep(1e9)}
}
客戶端rpcx_client.go代碼:
package mainimport ("flag"example "github.com/rpcxio/rpcx-examples""github.com/smallnest/rpcx/server"
)var addr = flag.String("addr", "localhost:8972", "server address")func main() {flag.Parse()s := server.NewServer()// s.RegisterName("Arith", new(example.Arith), "")s.Register(new(example.Arith), "")s.Serve("tcp", *addr)
}
本地通過go run
測(cè)試驗(yàn)證成功。
3.2 編寫dockfile生成鏡像
服務(wù)端:
FROM golang:1.19-alpine as builder
WORKDIR /usr/src/app
ENV GOPROXY=https://goproxy.cn
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \apk add --no-cache ca-certificates tzdata
COPY ./go.mod ./
COPY ./go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o rpcx_serverFROM scratch as runner
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /usr/src/app/rpcx_server /opt/app/EXPOSE 8972CMD ["/opt/app/rpcx_server"]
客戶端:
FROM golang:1.19-alpine as builder
WORKDIR /usr/src/app
ENV GOPROXY=https://goproxy.cn
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \apk add --no-cache ca-certificates tzdata
COPY ./go.mod ./
COPY ./go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o rpcx_client FROM busybox as runner
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /usr/src/app/rpcx_client /opt/app/CMD ["/opt/app/rpcx_client"]
分別指向以下命令進(jìn)行生成及驗(yàn)證:
docker build . -t rpcx-server-demo:0.1.0
docker build . -t rpcx-client-demo:0.1.0之后通過docker images查看:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rpcx-server-demo 0.1.0 a13acd11fc0e 19 hours ago 10.7MB
3.3 通過yaml部署發(fā)布
服務(wù)端:
kubectl apply -f rpcx-server-demo.yaml
kubectl apply -f rpcx-server-demo-service.yaml
Kubernetes 中的服務(wù)(Service)和部署(Deployment)是兩個(gè)不同的資源對(duì)象,需要分別定義和創(chuàng)建。
rpcx-server-demo.yaml
文件用于創(chuàng)建 RPCX 服務(wù)器的部署。這個(gè)文件定義了部署所需的配置,如容器鏡像、副本數(shù)、資源限制等。通過執(zhí)行kubectl apply -f rpcx-server-demo.yaml
命令,您將創(chuàng)建一個(gè)部署對(duì)象,該對(duì)象將負(fù)責(zé)管理和運(yùn)行 RPCX 服務(wù)器的實(shí)例。rpcx-server-demo-service.yaml
文件用于創(chuàng)建 RPCX 服務(wù)器的服務(wù)。服務(wù)是 Kubernetes 中的一種資源對(duì)象,用于公開應(yīng)用程序的網(wǎng)絡(luò)訪問。通過執(zhí)行kubectl apply -f rpcx-server-demo-service.yaml
命令,您將創(chuàng)建一個(gè)服務(wù)對(duì)象,該對(duì)象將為 RPCX 服務(wù)器提供一個(gè)穩(wěn)定的網(wǎng)絡(luò)地址,以便其他應(yīng)用程序可以通過該地址與服務(wù)器進(jìn)行通信。
通過將這兩個(gè) YAML 文件分開,您可以更好地組織和管理應(yīng)用程序的部署和服務(wù)。部署文件負(fù)責(zé)定義和管理應(yīng)用程序的實(shí)例,而服務(wù)文件負(fù)責(zé)定義和管理應(yīng)用程序的網(wǎng)絡(luò)訪問。這種分離可以提高可維護(hù)性和靈活性,并使您能夠更好地管理應(yīng)用程序的不同方面。
客戶端:
kubectl apply -f rpcx-client-demo.yaml
客戶端通常不需要像服務(wù)端那樣暴露網(wǎng)絡(luò)服務(wù),所以不需要?jiǎng)?chuàng)建服務(wù)對(duì)象。
在這種情況下,只需使用 kubectl apply -f rpcx-client-demo.yaml
命令來創(chuàng)建客戶端的部署對(duì)象即可。該部署對(duì)象將負(fù)責(zé)管理和運(yùn)行 RPCX 客戶端的實(shí)例。
客戶端通常是作為一個(gè)獨(dú)立的應(yīng)用程序運(yùn)行,它會(huì)連接到服務(wù)端提供的網(wǎng)絡(luò)地址進(jìn)行通信。因此,不需要為客戶端創(chuàng)建服務(wù)對(duì)象,因?yàn)榭蛻舳瞬恍枰_網(wǎng)絡(luò)訪問。
參考:
極客時(shí)間部分教程
想學(xué)習(xí)k8s但沒有環(huán)境?使用minikube輕松搭建一個(gè) https://mp.weixin.qq.com/s/aExQHKHsqsOChDrT4Lz0vw
構(gòu)建 Golang 應(yīng)用最小 Docker 鏡像 https://www.cnblogs.com/hahaha111122222/p/17878985.html