SpringCloud kubernetes使用k8s作為注冊(cè)中心砖瞧,實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)

首先搭建k8s集群颁湖。見(jiàn) Centos安裝k8s

使用springcloud 創(chuàng)建兩個(gè)項(xiàng)目,我這里創(chuàng)建了一個(gè)talk一個(gè)project脖捻。想利用talk項(xiàng)目在k8s中,使用feign調(diào)用peoject項(xiàng)目兆衅。下面是具體實(shí)現(xiàn)

上代碼

  1. SpringCloud kubernetes maven 依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.shujunjun.project</groupId>
        <artifactId>shujunjun</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>talk</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>5.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-client-all</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-fabric8-all</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <!-- 負(fù)載均衡 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-fabric8-loadbalancer</artifactId>
        </dependency>

        <!-- 負(fù)載均衡 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-client-loadbalancer</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.5</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
    </build>
</project>
  1. 配置文件 bootstrap.yml
spring:
  cloud:
    kubernetes:
      discovery:
        # 讓所有命名空間服務(wù)都可以發(fā)現(xiàn)服務(wù)
        all-namespaces: true
        # 發(fā)現(xiàn)未標(biāo)記為“就緒”的服務(wù)端地址
        include-not-ready-addresses: true
        # ExternalName類型服務(wù)的列表  DiscoveryClient::getInstances 返回該列表 ServiceInstance::getMetadata
        include-external-name-services: true
        enabled: true
      config:
        name: talk-config
        namespace: default
        # 配置是否讀取配置文件
        enabled: true
      # 啟用屬性源監(jiān)控和配置重新加載
      reload:
        enabled: true
        # 允許監(jiān)視配置映射中的更改
        monitoring-config-maps: true
        # 觸發(fā)重新加載時(shí)使用的策略
        strategy: refresh
        # 指定如何偵聽(tīng)屬性源的更改
        mode: event
      loadbalancer:
        # 通過(guò)服務(wù)名啟用負(fù)載均衡
        mode: pod
  application:
    name: talk
  main:
    # 允許在Spring的ApplicationContext中覆蓋已有的Bean定義
    allow-bean-definition-overriding: true

這里我設(shè)置了允許讓k8s去覆蓋定義的bean地沮,同時(shí)設(shè)置了所有命名空間都可以發(fā)現(xiàn)服務(wù)。其次羡亩,利用talk-config 的configmap去設(shè)置服務(wù)的一些配置信息摩疑。這里測(cè)試使用,目前只設(shè)置了端口號(hào)

talk.config
[root@k8s-master shujunjun]# cat talk-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: talk-config
data:
  application.yml: |
   server:
     port: 8888

  1. 簡(jiǎn)單的feign調(diào)用接口
package com.shujunjun.project.feign;

import com.shujunjun.project.entity.dto.ProjectDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@FeignClient(name = "project", url = "${shujunjun.project.url:}")
public interface IProjectFeign {

    @GetMapping(value = "project")
    List<ProjectDTO> list();
}
  1. controller實(shí)現(xiàn)
package com.shujunjun.project.controller;

import com.shujunjun.project.entity.dto.ProjectDTO;
import com.shujunjun.project.feign.IProjectFeign;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
public class ProjectController {

    final IProjectFeign projectFeign;

    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping(value = "services")
    public List<String> getServices() {
        return discoveryClient.getServices();
    }

    @GetMapping(value = "project")
    public List<ProjectDTO> project() {
        return projectFeign.list();
    }
}
  1. project項(xiàng)目就是一個(gè)簡(jiǎn)單的接口
package com.shujunjun.project.controller;

import com.shujunjun.project.entity.Project;
import com.shujunjun.project.service.IProjectService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
public class ProjectController {
    

    final IProjectService projectService;
    

    @GetMapping(value = "project")
    public List<Project> project() {
        return projectService.list();
    }
}
  1. 使用docker build 鏡像到k8s服務(wù)器
[root@k8s-slave1 talk]# ls
Dockerfile  talk.jar
[root@k8s-slave1 talk]# cat Dockerfile
FROM openjdk:17-jdk-alpine
EXPOSE 8080
ADD talk.jar app.jar
ENTRYPOINT ["java","-jar","-Duser.timezone=GMT+08","app.jar"]
  1. 構(gòu)建talk項(xiàng)目鏡像(project項(xiàng)目同理)
[root@k8s-slave1 talk]# docker build -t talk:latest .
[+] Building 20.6s (7/7) FINISHED                                                                                                                                                              docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                     0.0s
 => => transferring dockerfile: 92B                                                                                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                                                                                        0.0s
 => => transferring context: 2B                                                                                                                                                                          0.0s
 => [internal] load metadata for docker.io/library/openjdk:17-jdk-alpine                                                                                                                                15.9s
 => [internal] load build context                                                                                                                                                                        1.4s
 => => transferring context: 93.37MB                                                                                                                                                                     1.4s
 => CACHED [1/2] FROM docker.io/library/openjdk:17-jdk-alpine@sha256:4b6abae565492dbe9e7a894137c966a7485154238902f2f25e9dbd9784383d81                                                                    0.0s
 => [2/2] ADD talk.jar app.jar                                                                                                                                                                           2.7s
 => exporting to image                                                                                                                                                                                   0.4s
 => => exporting layers                                                                                                                                                                                  0.4s
 => => writing image sha256:87f5c2f9ea674ad2570b43006bce21966fc63c87193fc482180c4e1257ff51ba                                                                                                             0.0s
 => => naming to docker.io/library/talk:latest                                                                                                                                                           0.0s
  1. 查看鏡像
[root@k8s-slave1 talk]# docker images
REPOSITORY                                                                      TAG       IMAGE ID       CREATED          SIZE
talk                                                                            latest    87f5c2f9ea67   46 minutes ago   419MB
project                                                                         latest    8733fdc4c777   3 days ago       419MB
192.168.121.128:8082/oaim-web                                                   latest    b883ef6510d2   3 weeks ago      156MB
istio/proxyv2                                                                   1.16.7    d90c7490ed6d   8 months ago     261MB
istio/pilot                                                                     1.16.7    e73936e7d5be   8 months ago     202MB
redis                                                                           latest    7614ae9453d1   2 years ago      113MB
mysql                                                                           latest    3218b38490ce   2 years ago      516MB
calico/node                                                                     v3.19.1   c4d75af7e098   2 years ago      168MB
calico/pod2daemon-flexvol                                                       v3.19.1   5660150975fb   2 years ago      21.7MB
calico/cni                                                                      v3.19.1   5749e8b276f9   2 years ago      146MB
calico/kube-controllers                                                         v3.19.1   5d3d5ddc8605   2 years ago      60.6MB
kubernetesui/dashboard                                                          v2.0.0    8b32422733b3   3 years ago      222MB
registry.aliyuncs.com/google_containers/kube-proxy                              v1.18.0   43940c34f24f   3 years ago      117MB
registry.aliyuncs.com/google_containers/pause                                   3.2       80d28bedfe5d   4 years ago      683kB
registry.aliyuncs.com/google_containers/coredns                                 1.6.7     67da37a9a360   4 years ago      43.8MB
registry.cn-hangzhou.aliyuncs.com/kubeapps/k8s-gcr-kubernetes-dashboard-amd64   v1.8.3    0c60bcf89900   6 years ago      102MB
bingozhou/mysql5.7                                                              latest    8dbbe042b8f7   6 years ago      407MB

如上述顯示所示畏铆,talk和project項(xiàng)目已經(jīng)打包至k8s從節(jié)點(diǎn)雷袋。你也可以通過(guò)Nexus統(tǒng)一管理鏡像

  1. 在k8s環(huán)境中創(chuàng)建具體服務(wù)

創(chuàng)建服務(wù)之前,給默認(rèn)用戶賦權(quán)限辞居,否則項(xiàng)目啟動(dòng)會(huì)報(bào)錯(cuò)

 [project] [els.V1Service-1] i.k.c.informer.cache.ReflectorRunnable   : class io.kubernetes.client.openapi.models.V1Service#Reflector loop failed unexpectedly

io.kubernetes.client.openapi.ApiException: class V1Status {
    apiVersion: v1
    code: 403
    details: class V1StatusDetails {
        causes: null
        group: null
        kind: services
        name: null
        retryAfterSeconds: null
        uid: null
    }
    kind: Status
    message: services is forbidden: User "system:serviceaccount:default:default" cannot list resource "services" in API group "" at the cluster scope
    metadata: class V1ListMeta {
        _continue: null
        remainingItemCount: null
        resourceVersion: null
        selfLink: null
    }
    reason: Forbidden
    status: Failure
}

因此需要給默認(rèn)用戶足夠權(quán)限楷怒。我這里為了方便賦的權(quán)限比較大蛋勺,具體可以根據(jù)自己的情況設(shè)置
如下:auth.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-service-endpoints-reader
rules:
- apiGroups: [""]
  resources: ["pods", "services", "endpoints", "secrets", "configmaps"]
  verbs: ["get", "watch", "list"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-service-endpoints-reader-binding
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-service-endpoints-reader
  apiGroup: rbac.authorization.k8s.io
  1. 創(chuàng)建talk.yaml和對(duì)應(yīng)需要的configmap配置
[root@k8s-master shujunjun]# ls
project-config.yaml  project.yaml  talk-config.yaml  talk.yaml
[root@k8s-master shujunjun]# cat talk-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: talk-config
data:
  application.yml: |
   server:
     port: 8888
[root@k8s-master shujunjun]# cat talk.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: talk
spec:
  replicas: 1
  selector:
    matchLabels:
      app: talk
  template:
    metadata:
      labels:
        app: talk
    spec:
    #  serviceAccountName: shujunjun
      containers:
      - name: talk
        image: talk:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8888

---

apiVersion: v1
kind: Service
metadata:
  name: talk
spec:
  type: LoadBalancer
  ports:
  - port: 8888
    targetPort: 8888
    nodePort: 8888
  selector:
    app: talk

project類似處理,這里不再贅述

  1. 部署應(yīng)用
[root@k8s-master shujunjun]# kubectl apply -f talk.yaml
deployment.apps/talk created
service/talk created
部署效果
  1. 測(cè)試效果


    ok

    通過(guò)kubernetes使用feign調(diào)用成功


    查看k8s上其他服務(wù)

    也可以查看k8s中其他服務(wù)信息
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸠删,一起剝皮案震驚了整個(gè)濱河市抱完,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刃泡,老刑警劉巖巧娱,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烘贴,居然都是意外死亡禁添,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)庙楚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)上荡,“玉大人,你說(shuō)我怎么就攤上這事馒闷±壹瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵纳账,是天一觀的道長(zhǎng)逛薇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)疏虫,這世上最難降的妖魔是什么永罚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮卧秘,結(jié)果婚禮上呢袱,老公的妹妹穿的比我還像新娘。我一直安慰自己翅敌,他們只是感情好羞福,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蚯涮,像睡著了一般治专。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遭顶,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天张峰,我揣著相機(jī)與錄音,去河邊找鬼棒旗。 笑死喘批,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谤祖,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼婿滓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼老速!你這毒婦竟也來(lái)了粥喜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤橘券,失蹤者是張志新(化名)和其女友劉穎额湘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體旁舰,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锋华,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箭窜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毯焕。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖磺樱,靈堂內(nèi)的尸體忽然破棺而出纳猫,到底是詐尸還是另有隱情,我是刑警寧澤竹捉,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布芜辕,位于F島的核電站,受9級(jí)特大地震影響块差,放射性物質(zhì)發(fā)生泄漏侵续。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一憨闰、第九天 我趴在偏房一處隱蔽的房頂上張望状蜗。 院中可真熱鬧,春花似錦鹉动、人聲如沸轧坎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眶根。三九已至,卻和暖如春边琉,著一層夾襖步出監(jiān)牢的瞬間属百,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工变姨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留族扰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像渔呵,于是被迫代替她去往敵國(guó)和親怒竿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容