主頁 > 後端開發 > 半小時體驗云原生:手把手教你在k8s上部署springboot應用——干貨分享,建議收藏

半小時體驗云原生:手把手教你在k8s上部署springboot應用——干貨分享,建議收藏

2021-08-18 07:53:03 後端開發

圖片

你會不會對“云原生”很有興趣,卻不知道從何入手?

本文會在window環境下,構建一套基于k8s的istio環境,并且通過skaffold完成鏡像的構建和專案部署到集群環境,其實對于實驗環境有限的朋友們,完全可以在某里云上,按量付費搞3臺”突發性能實體“,玩一晚,也就是杯咖啡錢,

好吧,讓我開始吧!

執行流程

整體流程的話,如下圖所示,通過 Skaffold+jib 將開發的應用打包成鏡像,提交到本地倉庫,并且將應用部署到集群中,k8s中部署2個pod,模擬應用不同的版本,并且配置訪問權重20%:80%,

圖片

環境選擇

我之前有文章詳細介紹過minikube,本次實驗,開始的時候,我就一直沉溺在使用kind的便捷上,而且直接可以在docker上部署集群,可以說非常方便,但是由于我對K8S的理解并不足夠,導致后面遇到了很多問題,所以,在這里建議新上手的小伙伴,還是使用minikube吧,k3s和RKE都需要多臺虛擬機,礙于機器性能,這種方案暫時不考慮了,

下面表格,對比了minikube、kind、k3s 部署環境,以及支持情況,方便大家選擇,

minikubekindk3s
runtimeVMcontainernative
supported architecturesAMD64AMD64AMD64, ARMv7, ARM64
supported container runtimesDocker,CRI-O,containerd,gvisorDockerDocker, containerd
startup time initial/following5:19 / 3:152:48 / 1:060:15 / 0:15
memory requirements2GB8GB (Windows, MacOS)512 MB
requires root?nonoyes (rootless is experimental)
multi-cluster supportyesyesno (can be achieved using containers)
multi-node supportnoyesyes
project pagehttps://minikube.sigs.k8s.io/https://kind.sigs.k8s.io/https://k3s.io/

[1] 表格參考自:http://jiagoushi.pro/minikube-vs-kind-vs-k3s-what-should-i-use

docker desktop 沒有特殊要求,其他的自己用的順手就好,還是需要特別說一下minikube,別用最新的coredns一直都拉不下來,除非你的魔法,可以完全搞定,否則,還是用阿里編譯的minikube版本吧,別跟自己較勁,別問我為什么...

我用的版本羅列在下面了:

? ~ istioctl version
client version: 1.10.2
control plane version: 1.10.2
data plane version: 1.10.2 (10 proxies)

? ~ minikube version
minikube version: v1.18.1
commit: 511aca80987826051cf1c6527c3da706925f7909

? ~ skaffold version
v1.29.0

環境搭建

使用minikube創建集群

使用 hyperv 作為引擎 , 記憶體 8192M cup 4核,不能再少了,否則拉不起來 istio

? ~ minikube start  --image-mirror-country='cn' --registry-mirror=https://hq0igpc0.mirror.aliyuncs.com --vm-driver="hyperv" --memory=8192 --cpus=4 --hyperv-virtual-switch="minikubeSwitch" --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

還要在 hyperv里創建一個虛擬路由,這里我構建了一個內部網路,這樣可以通過設定網卡的ip,將內部網路的網段固定下來,否則,每次重啟都會變化ip

配置讓內部網路,共享訪問互聯網

圖片

啟動成功

? istio-1.10.2 minikube start
😄 Microsoft Windows 10 Pro 10.0.19042 Build 19042 上的 minikube v1.18.1
🎉 minikube 1.20.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.20.0

? 根據現有的組態檔使用 hyperv 驅動程式
👍 Starting control plane node minikube in cluster minikube
🔄 Restarting existing hyperv VM for "minikube" ...
🐳 正在 Docker 20.10.3 中準備 Kubernetes v1.20.2…
🔎 Verifying Kubernetes components...
  ? Using image registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v4 (global image repository)
  ? Using image registry.hub.docker.com/kubernetesui/dashboard:v2.1.0
  ? Using image registry.hub.docker.com/kubernetesui/metrics-scraper:v1.0.4
  ? Using image registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.2.1 (global image repository)
🌟 Enabled addons: metrics-server, storage-provisioner, dashboard, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

部署 istio

創建 istio-system 的命名空間

kubectl create namespace istio-system

安裝 istio

istioctl manifest apply --set profile=demo

安裝完成后,執行命令 kubectl get svc -n istio-system

? ~ kubectl get svc -n istio-system
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                     AGE
istio-egressgateway   ClusterIP      10.105.31.73     <none>        80/TCP,443/TCP                                                               8d
istio-ingressgateway   LoadBalancer   10.103.61.73     <pending>     15021:31031/TCP,80:31769/TCP,443:30373/TCP,31400:31833/TCP,15443:32411/TCP   8d
istiod                 ClusterIP      10.110.109.205   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                                       8d

部署 bookinfo

部署 bookinfo demo 驗證環境

執行命令

kubectl label namespace default istio-injection=enabled

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

等待pod都啟動起來以后,添加bookinfo網路配置,用于訪問 kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml

? istio-1.10.2 kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml

gateway.networking.istio.io/bookinfo-gateway created

virtualservice.networking.istio.io/bookinfo created

使用命令查看service : kubectl get services

? ~ kubectl get services
NAME             TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
callme-service   NodePort    10.106.26.24     <none>        8080:30101/TCP   8d
details         ClusterIP   10.110.253.19   <none>        9080/TCP         8d
kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP         8d
productpage     ClusterIP   10.96.246.175   <none>        9080/TCP         8d
ratings         ClusterIP   10.99.234.109   <none>        9080/TCP         8d
reviews         ClusterIP   10.103.177.123   <none>        9080/TCP         8d

查看pods狀態 kubectl get pods

? ~ kubectl get pods
NAME                                 READY   STATUS   RESTARTS   AGE
callme-service-v1-76dd76ddcc-znb62   2/2     Running   0         4h59m
callme-service-v2-679db76bbc-m4svm   2/2     Running   0         4h59m
details-v1-79f774bdb9-qk9q8          2/2     Running   8         8d
productpage-v1-6b746f74dc-p4xcb      2/2     Running   8         8d
ratings-v1-b6994bb9-dlvjm            2/2     Running   8         8d
reviews-v1-545db77b95-sgdzq          2/2     Running   8         8d
reviews-v2-7bf8c9648f-t6s8z          2/2     Running   8         8d
reviews-v3-84779c7bbc-4p8hv          2/2     Running   8         8d

查看集群ip 以及 埠

? ~ kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}'
192.168.137.115



? istio-1.10.2 kubectl get svc istio-ingressgateway -n istio-system

NAME         TYPE     CLUSTER-IP   EXTERNAL-IP PORT(S)                                   AGE

istio-ingressgateway LoadBalancer  10.110.228.32 <pending>   15021:32343/TCP,80:30088/TCP,443:31869/TCP,31400:32308/TCP,15443:32213/TCP 3m17s

于是訪問地址: http://192.168.137.115:31769/productpage

圖片

我們 bookinfo 就部署成功了,接下來我們創建應用

構建應用

圖片

構建一個普通的springboot工程,添加編譯插件,這里我們使用了本地的docker倉庫存盤鏡像

<build>
      <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
              <executions>
                  <execution>
                      <goals>
                          <goal>build-info</goal>
                          <goal>repackage</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
          <plugin>
              <groupId>com.google.cloud.tools</groupId>
              <artifactId>jib-maven-plugin</artifactId>
              <version>3.1.1</version>
              <configuration>
                  <to>
                      <image>127.0.0.1:9001/${project.artifactId}:${project.version}</image>
                      <auth>
                          <username>
                              xxx
                          </username>
                          <password>
                              xxx
                          </password>
                      </auth>
                  </to>
                  <allowInsecureRegistries>true</allowInsecureRegistries>
              </configuration>
          </plugin>
      </plugins>
  </build>

構建一個簡單的rest,現實一個構建名稱,以及配置的一個版本號

@Autowired
BuildProperties buildProperties;
@Value("${VERSION}")
private String version;

@GetMapping("/ping")
public String ping() {
   LOGGER.info("Ping: name={}, version={}", buildProperties.getName(), version);
   return "I'm callme-service " + version;
}

創建 skaffold.xml 用于給 skafflod 編譯鏡像,提交集群使用

apiVersion: skaffold/v2alpha1
kind: Config
build:
artifacts:
  - image: 127.0.0.1:9001/callme-service
    jib: {}
tagPolicy:
  gitCommit: {}

創建k8s的部署描述k8s/deployment.yml,以及service用于訪問

apiVersion: apps/v1
kind: Deployment
metadata:
name: callme-service-v1
spec:
replicas: 1
selector:
  matchLabels:
    app: callme-service
    version: v1
template:
  metadata:
    labels:
      app: callme-service
      version: v1
  spec:
    containers:
      - name: callme-service
        image: 127.0.0.1:9001/callme-service
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 8080
        env:
          - name: VERSION
            value: "v1"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: callme-service-v2
spec:
replicas: 1
selector:
  matchLabels:
    app: callme-service
    version: v2
template:
  metadata:
    labels:
      app: callme-service
      version: v2
  spec:
    containers:
      - name: callme-service
        image: 127.0.0.1:9001/callme-service
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 8080
        env:
          - name: VERSION
            value: "v2"
---
apiVersion: v1
kind: Service
metadata:
name: callme-service
labels:
  app: callme-service
spec:
type: NodePort
ports:
- port: 8080
  name: http
  nodePort: 30101
selector:
  app: callme-service

創建 istio描述檔案 k8s\istio-rules.yaml

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: callme-service-destination
spec:
host: callme-service
subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
# trafficPolicy: # --- enable for adding circuit breaker into DestinationRule
#   connectionPool:
#     http:
#       http1MaxPendingRequests: 1
#       maxRequestsPerConnection: 1
#       maxRetries: 0
#   outlierDetection:
#     consecutive5xxErrors: 3
#     interval: 30s
#     baseEjectionTime: 1m
#     maxEjectionPercent: 100
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: callme-service-route
spec:
hosts:
  - callme-service
http:
  - route:
    - destination:
        host: callme-service
        subset: v2
      weight: 80
    - destination:
        host: callme-service
        subset: v1
      weight: 20
    retries:
      attempts: 3
      retryOn: gateway-error,connect-failure,refused-stream
    timeout: 0.5s
#     fault: # --- enable for inject fault into the route
#       delay:
#         percentage:
#           value: 33
#         fixedDelay: 3s

運行 skaffold 進行編譯,提交鏡像,并部署應用 skaffold run --tail

? callme-service git:(master) ? skaffold run --tail
Generating tags...

- 127.0.0.1:9001/callme-service -> 127.0.0.1:9001/callme-service:e9c731f-dirty
  Checking cache...
- 127.0.0.1:9001/callme-service: Found Locally
  Starting test...
  Tags used in deployment:
- 127.0.0.1:9001/callme-service -> 127.0.0.1:9001/callme-service:60f1bf39367673fd0d30ec1305d8a02cb5a1ed43cf6603e767a98dc0523c65f3
  Starting deploy...
- deployment.apps/callme-service-v1 configured
- deployment.apps/callme-service-v2 configured
- service/callme-service configured
- destinationrule.networking.istio.io/callme-service-destination configured
- virtualservice.networking.istio.io/callme-service-route configured
  Waiting for deployments to stabilize...
- deployment/callme-service-v1: waiting for init container istio-init to start
  - pod/callme-service-v1-76dd76ddcc-znb62: waiting for init container istio-init to start
- deployment/callme-service-v2: waiting for init container istio-init to start
  - pod/callme-service-v2-679db76bbc-m4svm: waiting for init container istio-init to start
- deployment/callme-service-v2 is ready. [1/2 deployment(s) still pending]
- deployment/callme-service-v1 is ready.
  Deployments stabilized in 45.671 seconds

訪問查看結果

圖片

致此,我們初級的環境搭建基本完成了,對應云原生,感覺懂了一點,好像又沒有懂,需要理解的東西還有很多,這個系列也會持續下去,希望大家和我交流,也歡迎關注,轉發,

參考鏈接;

https://piotrminkowski.com/2020/02/14/local-java-development-on-kubernetes/

https://pklinker.medium.com/integrating-a-spring-boot-application-into-an-istio-service-mesh-a55948666fd

https://blog.csdn.net/xixingzhe2/article/details/88537038

https://blog.csdn.net/chenleiking/article/details/86716049

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/294460.html

標籤:java

上一篇:SpringBoot 實戰:優雅的使用列舉引數(原理篇)

下一篇:# Day11-Java基礎

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more