spring cloud kubernetes 學(xué)習(xí)記錄(1):hello world

在微服務(wù)領(lǐng)域雹顺,spring cloud 與 kubernetes 一直被拿來(lái)做比較,但實(shí)際上,這兩者有著不同得定義咧擂。

  • spring cloud : 基于 spring boot 得微服務(wù)解決方案窟社,有著完整得微服務(wù)生態(tài)體系券勺。
  • kubernetes : 用于跨多個(gè)主機(jī)管理容器化應(yīng)用程序,為應(yīng)用程序的部署灿里,維護(hù)和擴(kuò)展提供基本機(jī)制关炼。提供對(duì)容器得管理機(jī)制。

兩者并非是相同匣吊、互斥得技術(shù)儒拂,相反,兩者都是微服務(wù)領(lǐng)域各自部分里屬于頂尖色鸳,如果兩者能結(jié)合起來(lái)社痛,那肯定會(huì)給開(kāi)發(fā)、維護(hù)帶來(lái)無(wú)數(shù)得好處與優(yōu)勢(shì)缕碎。

spring cloud kubernetes 就是這樣一個(gè)項(xiàng)目褥影,使用 kubernetes 作為服務(wù)得運(yùn)行容器,kubernetes 將代替注冊(cè)中心咏雌、配置中心得職責(zé)凡怎,并提供kubernetes其他得功能校焦。

spring cloud kubernetes gitHub 地址:spring-cloud-kubernetes

現(xiàn)在開(kāi)始學(xué)習(xí) spring cloud kubernetes 與 kubernetes ,編寫第一個(gè) hello world 項(xiàng)目。

Hello world

spring cloud kubernetes hello world 項(xiàng)目

按照官方文檔例子统倒,先建立一個(gè) spring boot 項(xiàng)目寨典,然后在 pom.xml 中加入以下依賴:

  <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-kubernetes</artifactId>
           <version>${latest.version}</version>
 </dependency>

目前 spring cloud kubernetes 公開(kāi)版本只有 0.3.0.RELEASE、0.2.0.RELEASE房匆,該例子使用 0.3.0.RELEASE 版本耸成。

在 Application 中加入以下注解:

@SpringBootApplication
@EnableDiscoveryClient
public class HelloWorldApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }
}

編寫一個(gè)HelloWorldController:

@RestController
public class HelloWorldController {
    private static final Log log = LogFactory.getLog(HelloWorldController.class);

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/")
    public String hello() {
        return "Hello World";
    }

    @RequestMapping("/services")
    public List<String> services() {
        return this.discoveryClient.getServices();
    }
}

注入得 DiscoveryClient 是基于 kubernetes 容器得實(shí)現(xiàn),/services 接口 會(huì)返回 kubernetes 中所有得service名稱浴鸿。

在 application.perproties 中加入以下屬性:

spring.application.name=hello_world

這個(gè)名稱非常重要井氢,如果想在其他服務(wù)使用服務(wù)名稱來(lái)訪問(wèn)服務(wù)得話,如:http://hello_world/services 岳链,該名稱必須要與 kubernetes services 得名稱相同花竞。

到此, hello_world 項(xiàng)目已經(jīng)完成掸哑,非常簡(jiǎn)單得項(xiàng)目约急,接下來(lái)需要將服務(wù)運(yùn)行在 kubernetes 上。

kubernetes

首先需要安裝 kubernetes 容器苗分,并將其運(yùn)行起來(lái)厌蔽,可以選擇 kubernetes 集群或者用于本地調(diào)試開(kāi)發(fā)得 minikube 上,具體可看 kubernetes-安裝文檔

本例子使用的是基于docker的kubernetes集群摔癣。

環(huán)境安裝好之后奴饮,首先要?jiǎng)?chuàng)建出hello_world的docker的運(yùn)行鏡像,創(chuàng)建 Dockerfile 文件供填,并寫入以下內(nèi)容:

FROM openjdk:8-jdk-alpine
VOLUME /var/demo/
COPY hello_world-1.0.0.jar hello_world.jar
ENV JAVA_OPTS=""
ENTRYPOINT exec java -jar /hello_world.jar --debug

將 Dockerfile 與 打包出來(lái)的 jar 包都復(fù)制到 /var/demo/hello_world 目錄中拐云,并執(zhí)行 Docker 命令創(chuàng)建 image:

docker build --file=Dockerfile --tag=hello_word:latest --rm=true .

執(zhí)行成功應(yīng)返回 Successfully 標(biāo)識(shí),并執(zhí)行 docker images 命令近她,應(yīng)能看到該鏡像:


docker_images.png

注意:如果是 kubernetes 集群的話叉瘩,應(yīng)該在集群每一部節(jié)點(diǎn)上都執(zhí)行上面的過(guò)程,如果不想則需要配置 Docker 的本地倉(cāng)庫(kù)粘捎。

docker image 配置完畢之后薇缅,則開(kāi)始配置kubernetes運(yùn)行該image。

1攒磨、創(chuàng)建 deployment

使用以下命令來(lái)創(chuàng)建一個(gè) deployment :

kubectl run hello-word --image=hello_word:latest --port=8080 --image-pull-policy=Never

--image:指定 hello_word 鏡像泳桦,版本為 latest 。
--port:指定為 8080 端口娩缰,因?yàn)?spring boot 默認(rèn)得端口為 8080灸撰。
--image-pull-policy=Never:不從Docker 公共服務(wù)器中拉去鏡像,而是從本地拉取。

使用 kubectl get deployments 命令來(lái)查看是否成功:


deployments .png

再使用 kubectl get pods 來(lái)查看容器是否運(yùn)行成功:


1D9A8E51-F551-46d4-B19D-3E51CCAC9CBA.png

當(dāng) status 為 Running 得時(shí)候浮毯,表示正常運(yùn)行完疫,可以使用 kubectl logs [name] 來(lái)查看日志信息。

2债蓝、創(chuàng)建service

當(dāng)deployment創(chuàng)建成功時(shí)壳鹤,只代表了里面運(yùn)行了這個(gè)容器,需要對(duì)這個(gè)容器進(jìn)行定義 service 饰迹,才能被外界訪問(wèn)芳誓。
使用以下命令來(lái)定義一個(gè) service :

kubectl expose deployment hello-world --type=NodePort

--type=NodePort:使集群外部的服務(wù)可用,將對(duì)應(yīng)IP:端口得請(qǐng)求映射到8080端口上啊鸭。

expose 命令將使端口隨機(jī)分配锹淌,默認(rèn)范圍是30000-32767,如果需要指定端口莉掂,需要使用配置文件得形式進(jìn)行啟動(dòng)葛圃。

使用 kubectl get services 命令來(lái)查看是否成功:


services.png

可以看到,上圖顯示 type = NodePort 憎妙,集群IP 為 10.99.24.253,端口為:32433 曲楚,到現(xiàn)在厘唾,服務(wù)已經(jīng)運(yùn)行在 kubernetes 上了。

但如果使用 10.99.24.253:32433 進(jìn)行訪問(wèn)接口龙誊,是訪問(wèn)不到得抚垃,因?yàn)?kubernetes 只有一個(gè)主IP可以對(duì)外訪問(wèn),10.99.24.253得IP是 kubernetes 內(nèi)部IP趟大,獲取主IP命令如下:

kubectl cluster-info
master-info

可以看到鹤树,我這邊得IP為:172.31.176.30
那位訪問(wèn)接口就為: http://172.31.176.30:32433,分別訪問(wèn) / 與 /service 接口如下:


/.png

/service.png

在訪問(wèn) /services 得時(shí)候逊朽,可以會(huì)得到以下錯(cuò)誤:

{
   "timestamp":"2018-12-05T08:18:31.503+0000",
   "status":500,
   "error":"Internal Server Error",
   "message":"Failure executing: GET at: https://kubernetes.default.svc/api/v1/namespaces/default/services. Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. services is forbidden: User "system:serviceaccount:default:default" cannot list resource "services" in API group "" in the namespace "default".",
   "path":"/services"
}

這表示了當(dāng)前執(zhí)行用戶沒(méi)有訪問(wèn)API得權(quán)限罕伯,具體可以看
kubernetes account
kubernetes role

如果不想看,可使用下面得命令進(jìn)行全部用戶賦予管理員權(quán)限:

kubectl create clusterrolebinding permissive-binding \
  --clusterrole=cluster-admin \
  --user=admin \
  --user=kubelet \
  --group=system:serviceaccounts

到此叽讳,使用spring cloud kubernetes 得 hello world 就結(jié)束了追他。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市岛蚤,隨后出現(xiàn)的幾起案子邑狸,更是在濱河造成了極大的恐慌,老刑警劉巖涤妒,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单雾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)硅堆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蜂奸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人硬萍,你說(shuō)我怎么就攤上這事扩所。” “怎么了朴乖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵祖屏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我买羞,道長(zhǎng)袁勺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任畜普,我火速辦了婚禮期丰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吃挑。我一直安慰自己钝荡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布舶衬。 她就那樣靜靜地躺著埠通,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逛犹。 梳的紋絲不亂的頭發(fā)上端辱,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音虽画,去河邊找鬼舞蔽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛码撰,可吹牛的內(nèi)容都是我干的渗柿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灸拍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼做祝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鸡岗,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤混槐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后轩性,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體声登,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悯嗓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片件舵。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脯厨,靈堂內(nèi)的尸體忽然破棺而出铅祸,到底是詐尸還是另有隱情,我是刑警寧澤合武,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布临梗,位于F島的核電站,受9級(jí)特大地震影響稼跳,放射性物質(zhì)發(fā)生泄漏盟庞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一汤善、第九天 我趴在偏房一處隱蔽的房頂上張望什猖。 院中可真熱鬧,春花似錦红淡、人聲如沸不狮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荤傲。三九已至,卻和暖如春颈渊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背终佛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工俊嗽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铃彰。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓绍豁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親牙捉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竹揍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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