k8s安裝
參見
kubernetes 的安裝與部署
https://www.jianshu.com/p/a4ec985977c2
常見錯誤
- 需要雙核cpu
- Error downloading packages libnetfilter_cthelper
解決:手動安裝 yum install -y libnetfilter_cthelper
- kubectl conflicts with file from package kubernetes-client
解決:yum remove kubernetes-client-1.5.2-0.7.git269f928.el7.centos.aarch64
- 無法啟動k8s服務,先執行kubeadm init
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address=192.168.197.10 \
--service-cidr=10.222.0.0/16 \
--pod-network-cidr=10.244.0.0/16
提示如下:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.197.10:6443 --token g01ldy.ikqrqrp2pgm18t4y \
--discovery-token-ca-cert-hash sha256:62ce23cd9b76c5409fec58f4a2b37e083fefc0204386d2d95546fe0b02109b31
根據提示然後執行下列指令
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
#如果是root使用者,執行下列指令
export KUBECONFIG=/etc/kubernetes/admin.conf
- 子節點加入k8s網絡,token 有效時間是24小時,如果過來24小時那麼需要重新整理token
# 在master 主節點上運作指令,重新整理 token
kubeadm token create --print-join-command
基本概念
Pod
pod并不等于容器。一個pod可以由多個容器組成。例如,Pod可以包括一個帶有Node.js應用程式的容器和另一個向web伺服器提供資料的容器。
pod有以下内容:
- 單一IP位址
- 共享主機
- 共享的IPC空間
- 共享網絡端口範圍
- 共享卷
組成pod的所有容器都運作在同一台機器上,不能跨多個節點拆分。
Pod的Kubectl指令行操作
建立并運作Pod
#建立命名空間 dev
kubectl create ns dev
#建立pod
kubectl run my-nginx --image=nginx:latest --port=80 --namespace=dev
查詢所有Pod的基本資訊
kubectl get pods -n dev -o wide –w
檢視Pod的詳細資訊
kubectl describe pod my-nginx -n dev
通路pod中容器提供的服務
curl 10.244.169.134:80
檢視pod的日志
kubectl logs -f my-nginx -n dev
重新開機指定的Pod
kubectl delete pod my-nginx -n dev
删除後自動建立,達到重新開機效果
Pod的Kubectl配置檔案操作
建立pod-nginx.yaml,内容如下:
[root@k8s-master ~]# vim pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: dev
spec:
containers:
- image: nginx:latest
imagePullPolicy: IfNotPresent
name: nginx-container
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
[root@k8s-master ~]#
通過指令式對象配置進行建立和删除
kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml
Deployment
deployments資源類型位于一個副本集(ReplicaSet)之上,可以對其進行操作。換句話說,deployments為pods副本集提供更新。
Deployment的Kubectl指令行操作
建立指定名稱的deployement
kubectl create deployment my-nginx --image=nginx -n dev
-n 指定命名空間
将deploy的一個pod拓展到4個pod
kubectl scale deployment my-nginx --replicas=4 -n dev
檢視deployment的資訊
kubectl get deploy -n dev
kubectl get pod -n dev
檢視deployment的詳細資訊
kubectl describe deployment my-nginx -n dev
删除deployment
deployment控制器删除,deployment下的pod也會被删除
kubectl delete deployment my-nginx -n dev
Service
如果我們想要連接配接到pods,就需要建立一個Service。在Kubernetes中,Service是一組pods上的網絡抽象。可以将其看作在叢集上運作的一組pods。Kubernetes服務通常用于支援微服務體系結構。
服務類型
可以使用的服務類型如下:
ClusterIP:
通過叢集的内部 IP 暴露服務,選擇該值,服務隻能夠在叢集内部可以通路,這也是預設的Service類型。ClusterIP類型的service建立時,k8s會通過etcd從可配置設定的IP池中配置設定一個IP,該IP全局唯一,且不可修改。所有通路該IP的請求,都會被iptables轉發到後端的endpoints中。
NodePort:
通過每個 Node 節點上的 IP 和靜态端口(NodePort)暴露服務。NodePort 服務會路由到 ClusterIP 服務,這個 ClusterIP 服務會自動建立。通過請求 :,可以從叢集的外部通路一個 NodePort 服務。
LoadBalancer:
需要外部支援(GCP and Azure),使用者通路service.spec.external-ip,該IP對應到一個外部負載均衡的vip,外部服務對這個vip的請求,會被loadbalancer通過健康檢查和轉發,發送到一個運作着該服務pod的node上,并同樣通過nodePort裡的端口映射,發送給容器。
ExternalName:
使用者可以指定一個任意的名字,作為該service被解析的CNAME,這種類型的servcie不用指定clusterIP,是以kube-proxy不會管理這類service,這類service需要使用1.7版本以上的kubedns。
提供容器服務
對内提供服務
Pod的網絡是K8s在實體機上建立了一層Overlay Network實作的,而且在網卡上能夠看到這個網絡的位址。但是Service是一個完全虛拟的網絡層,并不會存在于任何網絡裝置上。它通過修改叢集内部的路由規則,僅對叢集内部有效。Deploment建立好應用之後,再為它生成一個Service對象。接下來就可以通過Service的域名通路到服務,形式是<Service Name>.<NameSpace>,比如你有為Deployment的應用建立了一個名為portal的Service在預設的命名空間,那麼叢集内想要通過Http通路這個應用,就可以使用http://portal.default。
對外提供服務
StatefulSet
介紹
RC、Deployment、DaemonSet都是面向無狀态的服務,它們所管理的Pod的IP、名字,啟停順序等都是随機的,而StatefulSet是什麼?顧名思義,有狀态的集合,管理所有有狀态的服務,比如MySQL、MongoDB叢集等。
StatefulSet本質上是Deployment的一種變體,在v1.9版本中已成為GA版本,它為了解決有狀态服務的問題,它所管理的Pod擁有固定的Pod名稱,啟停順序,在StatefulSet中,Pod名字稱為網絡辨別(hostname),還必須要用到共享存儲。
在Deployment中,與之對應的服務是service,而在StatefulSet中與之對應的headless service,headless service,即無頭服務,與service的差別就是它沒有Cluster IP,解析它的名稱時将傳回該Headless Service對應的全部Pod的Endpoint清單。
除此之外,StatefulSet在Headless Service的基礎上又為StatefulSet控制的每個Pod副本建立了一個DNS域名,這個域名的格式為:
$(podname).(headless server name)
FQDN:$(podname).(headless server name).namespace.svc.cluster.local
特點
Pod一緻性:包含次序(啟動、停止次序)、網絡一緻性。此一緻性與Pod相關,與被排程到哪個node節點無關;
穩定的次序:對于N個副本的StatefulSet,每個Pod都在[0,N)的範圍内配置設定一個數字序号,且是唯一的;
穩定的網絡:Pod的hostname模式為(statefulset名 稱 ) − (statefulset名稱)-(statefulset名稱)−(序号);
穩定的存儲:通過VolumeClaimTemplate為每個Pod建立一個PV。删除、減少副本,不會删除相關的卷。
headless service
為什麼需要 headless service 無頭服務?
在用Deployment時,每一個Pod名稱是沒有順序的,是随機字元串,是以是Pod名稱是無序的,但是在statefulset中要求必須是有序 ,每一個pod不能被随意取代,pod重建後pod名稱還是一樣的。而pod IP是變化的,是以是以Pod名稱來識别。pod名稱是pod唯一性的辨別符,必須持久穩定有效。這時候要用到無頭服務,它可以給每個Pod一個唯一的名稱 。
常用資訊
1. 常用指令
# 檢視k8s 運作日志指令, 這個比較有用,在k8s 啟動、kubeadm init、kubeadm join 階段可以輔助分析問題。
journalctl -xefu kubelet
# 檢視k8s驅動
systemctl show --property=Environment kubelet |cat
# 重新開機k8s
systemctl restart kubelet
# 啟動k8s
systemctl start kubelet
# 停止k8s
systemctl stop kubelet
# 開機自啟k8s
systemctl enable kubelet
# dashboard 擷取token
kubectl describe secret admin-user -n kubernetes-dashboard
# kubeadm 重置, 有些時候我們在使用kubeadm init 指令時會報錯,我們根據錯誤提示修複問題後需要重新進行 init 操作,是以需要進行reset重置
kubeadm reset
删除普通pod
#檢視deployment
kubectl get deployment --all-namespaces
#删除deploymnet,pod随之删除
kubectl delete deployment nacos-operator
#縮容
kubectl scale deployment/nacos-operator --replicas=0 -n default
删除nacos pod
kubectl scale statefulset nacos --replicas=0
删除service
kubectl delete svc myapp nacos-operator
删除mysql
kubectl scale rc mysql --replicas=0
2. 環境資訊
# k8s 安裝目錄
ll /etc/kubernetes/
總用量 32
-rw-------. 1 root root 5642 6月 28 15:19 admin.conf
-rw-------. 1 root root 5674 6月 28 15:19 controller-manager.conf
-rw-------. 1 root root 1986 6月 28 15:19 kubelet.conf
drwxr-xr-x. 2 root root 113 6月 28 15:19 manifests
drwxr-xr-x. 3 root root 4096 6月 28 15:19 pki
-rw-------. 1 root root 5618 6月 28 15:19 scheduler.conf
# 元件配置檔案目錄
ll /etc/kubernetes/manifests/
總用量 16
-rw-------. 1 root root 2310 6月 28 15:19 etcd.yaml
-rw-------. 1 root root 3378 6月 28 15:19 kube-apiserver.yaml
-rw-------. 1 root root 2879 6月 28 15:19 kube-controller-manager.yaml
-rw-------. 1 root root 1464 6月 28 15:19 kube-scheduler.yaml
# 自定義dashboard yaml檔案目錄
ll /opt/kube-dashboard/conf/
總用量 4
-rw-r--r--. 1 root root 1124 6月 29 08:41 admin-user-dashboard.yaml
ll /opt/apps/k8s/
總用量 4
-rw-r--r--. 1 root root 285 6月 29 08:25 k8s-dashboard.yaml
k8s部署 Ingress-nginx controller
什麼是 Ingress
Ingress 是對叢集中服務的外部通路進行管理的 API 對象,典型的通路方式是 HTTP。Ingress 可以提供負載均衡
Ingress 公開了從叢集外部到叢集内服務的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 資源上定義的規則控制。
下面是一個将所有流量都發送到同一 Service 的簡單 Ingress 示例:
但是 僅建立 Ingress 資源本身沒有任何效果,需要有對應的 Ingress 控制器 ,你可能需要部署 Ingress 控制器,例如 ingress-nginx。 你可以從許多 Ingress 控制器 中進行選擇。
什麼是 Ingress controller
為了讓 Ingress 資源工作,叢集必須有一個正在運作的 Ingress 控制器。k8s官網維護了 3 個Ingress控制器
目前支援和維護 AWS、 GCE 和 Nginx Ingress 控制器 ,本篇就拿 Ingress-nginx 作為控制器為例 講解一下如何部署
部署 Ingress-nginx controller
部署過程參考《k8s 1.23版本安裝Ingress-nginx》,要點如下:
- 修改ingress-nginx-controller的deploy.yaml
鏡像檔案位址,改成國内鏡像
Service Type改成NodePort
删除配置 externalTrafficPolicy: Local(不删除外部無法通路Ingress)
- 安裝service-nodeport.yaml,ingress-nginx相關的service配置檔案
- 安裝ingress-dev.yaml ,建立普通的nginx deployment和service(類似應用服務)
- 安裝 ingress.yaml,配置nginx監聽轉發
- 客戶機hosts檔案配置域名轉發 172.10.10.10 at.k8s.com,域名可指向k8s叢集中任意機器
- 客戶機使用浏覽器通路nginx,31972是ingress-nginx-controller的80對外映射端口,可使用kubectl get svc -n ingress-nginx檢視ingress-nginx-controller服務擷取
k8s部署springboot項目
建立springboot項目,并打包
@RestController
@RequestMapping("/k8s")
@Slf4j
public class K8sDemoController {
@GetMapping("hello")
public String hello(String name) {
String msg = String.format("Hello: %s welcome to k8s", name);
log.info("【{}】", msg);
return msg;
}
}
編寫Dockerfile
FROM openjdk:8
COPY ./target/test-k8s-demo-0.0.1-SNAPSHOT.jar /app/springboot-k8s-demo.jar
# 容器工作目錄
# WORKDIR /usr/local
# 設定字元集
ENV LANG C.UTF-8
ENTRYPOINT ["java", "-jar" , "/app/springboot-k8s-demo.jar"]
打包鏡像
為使用docker将/target/test-k8s-demo-0.0.1-SNAPSHOT.jar和Dockerfile上傳到k8s某個節點(也可以是安裝了docker的任何機器),執行下列指令
$ docker build -t boot-k8s-demo:v1 . #建構鏡像
注意最後有個點,預設使用 “上下文目錄(Context)下的名為Dockerfile 的檔案作為 Dockerfile”,在此,即用目前路徑的 Dockerfile 進行建構 。
把鏡像 push 到對應的 阿裡雲倉庫
浏覽器通路https://cr.console.aliyun.com/cn-hangzhou/instance/
進入阿裡雲容器鏡像服務,點選個人執行個體
點選鏡像倉庫菜單-建立鏡像倉庫按鈕,建立k8s倉庫
第一步倉庫名稱為k8s,倉庫類型選擇公開;第二部代碼源選擇本地倉庫
可在通路憑證-設定固定密碼設定通路密碼
docker tag boot-k8s-demo:v1 registry.cn-hangzhou.aliyuncs.com/muxiaoshan/k8s:v1
docker login --username=xxxxxx registry.cn-hangzhou.aliyuncs.com
docker push registry.cn-hangzhou.aliyuncs.com/muxiaoshan/k8s:v1
編寫 k8s deploy yaml 進行部署2個副本 + ingress 實作基本的負載均衡
apiVersion: apps/v1
kind: Deployment #部署
metadata:
name: springboot-app
spec:
replicas: 2 #2個副本
selector:
matchLabels:
app: springboot-app
template:
metadata:
labels:
app: springboot-app
spec:
containers:
- name: springboot-app
image: registry.cn-hangzhou.aliyuncs.com/muxiaoshan/k8s:v1 #剛剛push到阿裡雲上的鏡像位址
ports:
- containerPort: 20187 #springboot端口
---
apiVersion: v1
kind: Service
metadata:
name: springboot-app
spec:
selector:
app: springboot-app #選中上面的 Deployment
ports:
- port: 7003 #對外7003端口
targetPort: 20187
---
#Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: springboot.demo.com
http:
paths:
- path: /
pathType: Prefix # 字首比對
backend:
service:
name: springboot-app
port:
number: 7003
kubectl 部署 deploy-springboot-k8s.yaml
kubectl apply -f deploy-springboot-k8s.yaml
通路請求路徑 進行測試
先把 springboot.demo.com 域名添加到客戶機hosts,轉到k8s叢集中任何一台機器皆可
172.10.10.10 springboot.demo.com
客戶機浏覽器通路http://springboot.demo.com:31972/k8s/hello?name=sam
k8s部署nacos(可選)
推薦将注冊中心(包括nacos等)部署到k8s外,整個k8s叢集重新開機時,各個微服務節點常因連接配接不到叢集内的nacos而啟動失敗,而且叢集内nacos管理的服務容易掉線。加上nacos為有狀态服務,不建議部署到k8s,單獨搭建nacos叢集,友善管理與調試。《nacos官網叢集部署說明》
參考《k8s1.23.5部署nacos持久化叢集》,要點如下:
- 初始化外部資料庫(資料庫不部署到k8s)
- K8s configmap配置資料庫連接配接
- 部署Headless Service,在k8s中通過StatefulSet和Headless Service(沒有ClusterIP,無法負載均衡)為每個nacos執行個體生成一個唯一的dns位址
- 通過StatefulSet部署nacos。nacos鏡像使用v2.1.1版本,預設的latest是v2.0.3版本,新增配置會出錯
- service+ ingress配置,供外部通路nacos web
k8s部署微服務提供端
和部署springboot項目一樣。
完整代碼包括docker腳本,k8s部署腳本等參見https://gitee.com/biplatform/cloud-nacos
應用配置(資料庫連接配接等)釋出到nacos配置中心。連接配接配置中心的參數需要寫在 bootstrap.yml 裡面而不能在application.yml裡,服務bootstrap.yml配置如下,nacos位址用dns:
#連接配接配置中心的參數需要寫在 bootstrap 裡面,寫在 application 裡面無法連接配接配置中心,參見:https://blog.csdn.net/MrHaoo/article/details/124169653
spring:
application:
name: nacos-provider-demo
cloud:
nacos:
discovery: #注冊中心
server-addr: 172.10.10.11:8848,172.10.10.12:8848
config: #配置中心
server-addr: 172.10.10.11:8848,172.10.10.12:8848
file-extension: yml #必須的參數,否則無法正确連接配接配置中心
server:
port: 8000
如果微服務總是無法連接配接到nacos,注意檢查nacos是否正常啟動(資料庫連接配接是否正常等),使用如下指令進入叢集内nacos容器并檢視日志
kubectl exec –it nacos-1 /bin/bash
tail –f logs/nacos.log –n 200
服務提供端普通pod日志檢視
#擷取pod名稱
kubectl get pods
# -f 後跟pod名稱
kubectl logs -f nacos-provider-demo-c9cd4d8c9-7chqz
注意修改k8s deploy yaml檔案的Ingress name,不同服務用不同的Ingress name,下面為deploy-nacos-provider-demo.yaml的部配置設定置
#Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nacos-provider
annotations:
kubernetes.io/ingress.class: "nginx"
常見錯誤
- nacos配置中心啟動報錯java.nio.charset.MalformedInputException: Input length = 1
錯誤原因為nacos配置中心中配置或注釋包含中文
删除nacos配置中心的中文部分
- namespace 不能用指令空間名稱如prod、dev,而必須用id
- bootstrap.yml區分開發環境、生産環境問題
在一個bootstrap.yml檔案中可同時存在兩套配置
#服務配置
server:
port: 8291
# Spring
spring:
application:
# 應用名稱
name: nacos-provider-demo #應用名字
profiles:
# 環境配置
active: dev
##上面是基礎配置,不用上配置中心那種
##下面是環境區分,主要不同環境不同檔案擷取
---
#開發環境
spring:
profiles: dev
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: 0b656411-a4c8-4464-a726-d027bd0783ff
config:
server-addr: localhost:8848
file-extension: yml
group: DEFAULT_GROUP
namespace: 0b656411-a4c8-4464-a726-d027bd0783ff
---
#正式環境
spring:
profiles: prod
cloud:
nacos:
discovery:
server-addr: 172.10.10.11:8848,172.10.10.12:8848
namespace: 19234622-bf8e-44f2-a82e-201b8a995131
config:
server-addr: 172.10.10.11:8848,172.10.10.12:8848
file-extension: yml
group: DEFAULT_GROUP
namespace: 19234622-bf8e-44f2-a82e-201b8a995131
啟動時指定使用的profiles即可
普通啟動指令
java -jar -Dspring.profiles.active=prod provider-demo-1.0-SNAPSHOT.jar
Docker指令
ENTRYPOINT ["java", "-jar" , "-Dspring.profiles.active=prod", "/app/provider-demo-1.0-SNAPSHOT.jar"]
部署到k8s後,打開浏覽器通路http://nacos-provider-demo.com:31972/tenantInfo?current=1&size=10
Demo查詢的是nacos租戶資訊,通路效果如下:
K8s部署微服務消費端
和部署springboot項目一樣。
使用openfeign實作消費端對服務端的遠端調用,參見《Spring Cloud OpenFeign 詳解》
Openfeign發起get請求傳遞對象參數,參考《OpenFeign的get方法傳遞對象的兩種方式》
注意openfeign需要同時添加負載均衡依賴
<!-- 負載均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
@FeignClient标明遠端調用的服務名稱;@GetMapping标明遠端調用的服務路徑;@SpringQueryMap用于傳遞對象參數,不加則提示MethodNotAllowed異常
@FeignClient("nacos-provider-demo")
public interface DemoFeign {
/**
* 注解傳遞對象 @SpringQueryMap
* @param query
* @return
*/
@GetMapping(value = "/provider/share-osci-fpar-valid/getOsciFparValids")
Result<List<AirOsci>> search2(@SpringQueryMap ShareOsciFparValidQO query);
}
編寫一個Controller調用openfeign
@RestController
public class ConsumerController {
@Resource
private DemoFeign demoFeign;
@GetMapping("search")
public Result<List<AirOsci>> search(ShareOsciFparValidQO query)
{
return demoFeign.search2(query);
}
}
K8s部署網關
和部署springboot項目一樣。
注意,bootstrap.yml中啟用服務名稱對服務的通路,否則無法通過服務名稱轉發請求到微服務
spring:
cloud:
gateway:
discovery:
locator:
#開放服務名通路方式 true時候,可以使用位址 http://localhost:7000/service-wx/xler/wx/test1 就是直接可以通過服務名然後去定位controller位址進行通路
#false就 隻能 通過配置的路由進行通路
enabled: true
在網關上部署一個靜态頁面
網關頁面送出請求到consumer
Consumer通過openfeign請求到provider
效果如下:
至此完成個k8s叢集搭建、k8s叢集内部署微服務
參考文獻
1. kubernetes 的安裝與部署 https://www.jianshu.com/p/a4ec985977c2
2. Kubernetes進階之路(九)Service系列之ClusterIP&NodePort https://www.jianshu.com/p/c14cce5fc7a2
3. 一關系圖讓你了解K8s中的概念,Pod、Service、Job等到底有啥關系 - 知乎https://zhuanlan.zhihu.com/p/105006577
4. Kubernetes(k8s)的Namespace、Pod、Label、Deployment、Service實戰入門 https://blog.csdn.net/yy8623977/article/details/124769617
5. 何時使用kubernetes的deployments、pods和services?https://baijiahao.baidu.com/s?id=1690745074914054477
6. k8s部署springboot項目 https://blog.csdn.net/qq_34285557/article/details/124460872
7. k8s 新版本 部署 Ingress-nginx controller - Ingress相關概念描述 https://blog.csdn.net/qq_34285557/article/details/124254787
8. k8s 1.23版本安裝Ingress-nginx - 實際參照,修改deploy.yaml含國内鏡像下載下傳 https://blog.csdn.net/weixin_43054437/article/details/127171731
9. Ingress作用 - 當我們配置了Ingress規則後,kube-proxy就不再起作用,ingress-controller會直接從service所屬的endpoints中選擇一個Pod,将流量直接轉發到該Pod上,進而實作7層負載均衡 https://www.jianshu.com/p/23467210e62c
10. k8s ingress-nginx網絡無法通路到容器問題 - 删除此配置externalTrafficPolicy: Local http://events.jianshu.io/p/4e1a97577e33
11. k8s部署Nacos叢集 https://blog.csdn.net/baidu_38432732/article/details/124963395
12. [K8S系列八] K8S實戰 部署spring-cloud+nacos+MySQL服務 https://www.jianshu.com/p/4b445b46eb67
13. k8s部署nacos叢集(官方文檔版)https://blog.csdn.net/qq_45449792/article/details/123307796
14. k8s1.23.5部署nacos持久化叢集 – 配置檔案名清晰、過程清晰https://blog.csdn.net/weixin_42236986/article/details/123997114
15. K8S安裝部署Nacos叢集 – 配置代碼易複制
https://blog.csdn.net/u011936655/article/details/108364176
16. k8s安裝nacos(nacos鏡像版本2.0.3) – 解決新增配置失敗問題,更新鏡像
https://blog.csdn.net/chengqwertyuiop/article/details/125326953
17. k8s之StatefulSet詳解
https://blog.csdn.net/weixin_44729138/article/details/106054025
18. SpringCloud - feign以XML格式傳輸
https://blog.csdn.net/baiofchao/article/details/102524933
19. Spring Cloud OpenFeign 詳解
https://blog.csdn.net/qq_16116881/article/details/124267414
20. OpenFeign的get方法傳遞對象的兩種方式
https://blog.csdn.net/qq_47493459/article/details/124290580