Kubernetes系列01:Kubernetes入門
轉載的朋友請寫上來源,很多大量的文字都是我自己敲出來,付出很多辛苦。
最近在學習Kubernetes,將學習到的內容整理成博文,便於日後的後顧學習,也共享給網上的朋友,共同學習。
學習這個系列之前,需要有docker的知識,建議大家先學習下掌握些docker基礎。
什麼是Kubernetes?
Kubernetes是Google開源的容器叢集管理系統,實現基於Docker構建容器,利用Kubernetes能很方面管理多臺Docker主機中的容器。主要功能如下:
1)將多臺Docker主機抽象為一個資源,以叢集方式管理容器,包括任務排程、資源管理、彈性伸縮、滾動升級等功能。
2)使用編排系統(YAML File)快速構建容器叢集,提供負載均衡,解決容器直接關聯及通訊問題
3)自動管理和修復容器,簡單說,比如建立一個叢集,裡面有十個容器,如果某個容器異常關閉,
那麼,會嘗試重啟或重新分配容器,始終保證會有十個容器在執行,反而殺死多餘的。
Kubernetes角色組成:
1)Pod
Pod是kubernetes的最小操作單元,一個Pod可以由一個或多個容器組成;
同一個Pod只能執行在同一個主機上,共享相同的volumes、network、namespace;
2)ReplicationController(RC)
RC用來管理Pod,一個RC可以由一個或多個Pod組成,在RC被建立後,系統會根據定義好的副本數來建立Pod數量。
在執行過程中,如果Pod數量小於定義的,就會重啟停止的或重新分配Pod,反之則殺死多餘的。當然,也可以動態伸縮執行的Pods規模或熟悉。
RC通過label關聯對應的Pods,在滾動升級中,RC採用一個一個替換要更新的整個Pods中的Pod。
3)Service
Service定義了一個Pod邏輯集合的抽象資源,Pod集合中的容器提供相同的功能。集合根據定義的Label和selector完成,當建立一個Service後,
會分配一個Cluster IP,這個IP與定義的埠提供這個集合一個統一的訪問介面,並且實現負載均衡。
4)Label
Label是用於區分Pod、Service、RC的key/value鍵值對;
Pod、Service、RC可以有多個label,但是每個label的key只能對應一個;
主要是將Service的請求通過lable轉發給後端提供服務的Pod集合;
Kubernetes元件組成:
1)kubectl
客戶端命令列工具,將接受的命令格式化後傳送給kube-apiserver,作為整個系統的操作入口。
2)kube-apiserver
作為整個系統的控制入口,以REST API服務提供介面。
3)kube-controller-manager
用來執行整個系統中的後臺任務,包括節點狀態狀況、Pod個數、Pods和Service的關聯等。
4)kube-scheduler
負責節點資源管理,接受來自kube-apiserver建立Pods任務,並分配到某個節點。
5)etcd
負責節點間的服務發現和配置共享。
6)kube-proxy
執行在每個計算節點上,負責Pod網路代理。定時從etcd獲取到service資訊來做相應的策略。
7)kubelet
執行在每個計算節點上,作為agent,接受分配該節點的Pods任務及管理容器,週期性獲取容器狀態,反饋給kube-apiserver。
8)DNS
一個可選的DNS服務,用於為每個Service物件建立DNS記錄,這樣所有的Pod就可以通過DNS訪問服務了。
一、準備工作
測試環境:
CentOS Linux release 7.3
docker 1.12.6
etcd-3.1.0
kubernetes-1.5.2-0.2
kubernetes-client 1.5.2
kubernetes-master 1.5.2
kubernetes-node 1.5.2
踩坑提示:
1、請核對.yaml檔案的格式,有時候空格多了少了就報錯,我就遇到過。
2、yaml檔案中的image可以提前下載好,如docker pull kubeguide/tomcat-app:v1 避免下載時間過程問題
systemctl status firewalld
systemctl disable firewalld
systemctl stop firewalld
yum install etcd kubernetes
vi /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'修改為
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false --insecure-registry gcr.io'
vi /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admissioncontrol=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
刪除ServiceAccount
KUBE_ADMISSION_CONTROL="--admissioncontrol=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
二、建立DB容器(MySQL)
vi mysql-rc.yaml
apiVersion: v1
kind: ReplicationController --------副本控制器RC
metadata:
name: mysql -------------RC的名稱,全域性唯一
spec:
replicas: 1 -------------Pod副本期待數量
selector:
app: mysql -------------符合目標的Pod擁有此標籤
template: -------------根據此模板建立Pod的副本(例項)
metadata:
labels:
app: mysql --------Pod副本擁有的標籤,對應RC的Selector
spec:
containers: --------Pod內容器的定義部分
- name: mysql -------容器的名稱
image: mysql ------容器對應的Docker Image
ports:
- containerPort: 3306 --------容器暴露的埠號
env: -------注入到容器的環境變數
- name: MYSQL_ROOT_PASSWORD --------設定mysql root的密碼
value: "123456"
可能會遇到國外網路限制,無法從gcr.io拉取pause0.8.0的映象。那麼很簡單,就找個可用的映象拉取即可。
#docker pull docker.io/kubernetes/pause
#kubectl create -f mysql-rc.yaml
replicationcontroller "mysql" created
檢視下剛剛建立的RC:
#kubectl get rc
檢視Pod的建立情況:
#kubectl get pods
[
NAME DESIRED CURRENT READY AGE
mysql 1 1 0 23s
[[email protected] docker]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-hgkwr 0/1 ContainerCreating 0 44s
等待一會之後變為Running狀態
[
NAME READY STATUS RESTARTS AGE
mysql-mwvjs 1/1 Running 0 10m
刪除操作
[[email protected] docker]# kubectl delete -f mysql-rc.yaml
replicationcontroller "mysql" deleted
[[email protected] docker]# kubectl get rc
No resources found.
[
NAME READY STATUS RESTARTS AGE
mysql-hgkwr 0/1 Terminating 0 17m
[[email protected] docker]# kubectl delete po mysql-hgkwr
pod "mysql-hgkwr" deleted
之後建立一個與之關聯的kubernetes service-mysql自定義檔案
#vi mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
執行kubectl,建立service
#kubectl create -f mysql-svc.yaml
[[email protected] docker]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 39m
mysql 10.254.38.198 <none> 3306/TCP 21s
注意到MySQL服務被分配了一個值為10.254.38.198的Cluster IP地址,這是一個虛地址,kubernetes叢集中其他新建立的Pod就可以通過service的Cluster IP+埠號3306訪問它了。
三、建立WEB容器(TOMCAT)
#docker search tomcat-app
#docker images docker.io/kubeguide/tomcat-app
#docker pull docker.io/kubeguide/tomcat-app:v1
vi myweb-rc.yaml
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 5
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: '3306'
注意到上面RC對應的Tomcat容器裡引用了MYSQL_SERVICR_HOST=mysql這個環境標量,而"mysql"恰好是我們之前應以的MySQL服務的服務名。
[[email protected] docker]# kubectl create -f myweb-rc.yaml
replicationcontroller "myweb" created
[[email protected] docker]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-mwvjs 1/1 Running 0 54m
myweb-55wwb 0/1 ContainerCreating 0 1m
myweb-m4l5b 0/1 ContainerCreating 0 1m
myweb-nlql3 0/1 ContainerCreating 0 1m
myweb-qlg90 0/1 ContainerCreating 0 1m
myweb-v19sr 0/1 ContainerCreating 0 1m
建立對應的Service
vi myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
#kubectl create -f myweb-svc.yaml
[[email protected] docker]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 1h
mysql 10.254.38.198 <none> 3306/TCP 50m
myweb 10.254.134.175 <nodes> 8080:30001/TCP 10s
四、通過瀏覽器訪問網頁
瀏覽器訪問 http://虛擬機器IP:30001/demo
如果無法開啟介面,可以本機操作curl 127.0.0.1:30001 這個能通就行,不用非開啟介面。
參考:
Kubernetes管理Docker叢集之部署篇
http://lizhenliang.blog.51cto.com/7876557/1736572/
Kubernetes之kubectl常用命令
http://blog.csdn.net/xingwangc2014/article/details/51204224
kubernetes 高可用部署 HA
http://blog.csdn.net/u012214983/article/details/52267476
Building High-Availability Clusters
https://kubernetes.io/docs/admin/high-availability/
相關推薦
Kubernetes系列01:Kubernetes入門
轉載的朋友請寫上來源,很多大量的文字都是我自己敲出來,付出很多辛苦。 最近在學習Kubernetes,將學習到的內容整理成博文,便於日後的後顧學習,也共享給網上的朋友,共同學習。 學習這個系列之前,需要有docker的知識,建議大家先學習下掌握些docker基礎。 什麼是
Kubernetes系列04:深入掌握Pod
本節將對kubernetes如何釋出和管理應用進行說明和示例,主要包括Pod和容器的使用、Pod的控制和排程、應用配置管理等內容。1.Pod定義詳解 yaml格式的Pod定義檔案的完整內容: apiVersion: v1 kind: Pod metadata: name
Docker系列(九):kubernetes架構深度解析
Kubernetes重要概念 Docker解決了打包和隔離的問題,但我們需要更多:排程的問題,生命週期及健康狀況,服務發現,監控,認證,容器聚合。 Kubernetes概述 開源DOcker容器編排系統 輕量級,簡單 公有云,私有云以及混合雲中部署 模組化,可插拔化,可掛接,
Docker系列(八):kubernetes橫空出世背後的祕密
Docker與CoreOS的恩怨情仇 2013年2月,Docker建立了一個網站釋出它的首個演示版本, 3月,美國加州Alex Polvi正在自己的車庫開始 他的 第二次創業 有了第一桶金的Alex這次準備幹一票大的,他計劃開發一個足以顛覆傳統的伺服器系統的Linux發行版。為了提供
Docker系列(十三):Kubernetes Service的負載均衡和網路路由的祕密
Kubernetes Service設計分析 什麼是單體程式?所有的模組都在一個程序中 微服務,每一個服務是一個程序的模式 kubernetes中的service其實只是一個概念,是一組相同lable的pod。 Kubernetes Proxy執行機制分析 每個
爬蟲入門到放棄系列01:什麼是爬蟲
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210201173634123.png) ## 序章 18年初,還在實習期的我因為工作需求開始接觸Java爬蟲,從一個網站爬取了163W條poi資料,這是我人生中寫的第一個爬蟲,也是唯一的一個Java爬蟲。後來這些poi資
JAVA通信系列三:Netty入門總結
hand list code end @override ada 群發消息 -s object 一、Netty學習資料 書籍《Netty In Action中文版》 對於Netty的十一個疑問http://news.cnblogs.com/n/205413/ 深入淺出Net
redis系列01:源碼安裝redis-3.2.10
創建 好的 color netstat mon compress 手動 idf sta 前段時間安裝好的redis,今天用腳本安裝的時候突然出現版本異常的問題,所以更新一篇為大家提供參考 本次安裝在CentOS6.5,采用的redis-3.2.10,最新的redis-4.0
大白話Vue源碼系列(01):萬事開頭難
重要性 important 阮一峰 time 映射 處理 gpo 知識 catalog 閱讀目錄Vue 的源碼目錄結構預備知識先撿軟的捏 Angular 是 Google 親兒子,React 是 Facebook 小正太,那咱為啥偏偏選擇了 Vue 下手,一句話,Vue 是
Kubernetes 筆記 01 初識 Kubernetes 新時代的領航者
imageview logo orien 時間 知識 路線 分享 融合 我會 本文首發於我的公眾號 CloudDeveloper,歡迎大家關註,和我一起來學習雲計算。 大明王朝時期,明成祖朱棣為了發展海外貿易和建立自己的聲望,派鄭和七下西洋,創下了這段中國古代規模最大、船
Spring Boot 2.0 WebFlux 上手系列課程:快速入門(一)
02:WebFlux 快速入門實踐 Spring Boot 2.0 spring.io 官網有句醒目的話是: BUILD ANYTHING WITH SPRING BOOT Spring Boot (Boot 顧名思義,是引導的意思)框架是用於簡
零基礎學Java10系列一:程式設計入門
本課程主要講解JavaSE的發展歷史,JDK開發環境的搭建,CLASSPATH屬性作用,Java程式基本結構、基本資料型別的劃分及使用、程式結構、方法的定義與使用。本課程是作為Java系列課程的初期課程,掌握本課程之後可以繼續學習Java面向物件程式設計及高階開發部分。
ESP32系列教程:《入門篇:ESP32開發環境搭建》--Windows下使用VScode搭建ESP32開發環境
github地址:https://github.com/xiaolongba/wireless-tech 如何搭建ESP32開發環境 前言 ESP32是樂鑫在其上一代ESP8266一炮而紅之後,推出的第二代高性價比的產品,ESP32在上一代的基礎上增加了藍芽4.2的功能,加上
ESP32系列教程:《入門篇:建立第一個熱點》
[github原始碼地址] (https://github.com/xiaolongba/wireless-tech/tree/master/%E8%BD%AF%E4%BB%B6/%E7%BA%A2%E6%97%AD%E6%97%A0%E7%BA%BF%E5%BC%80%E5%8F%91%E6%
ESP32系列教程:《入門篇:ESP32開發環境搭建優化》,windows下開發速度堪比Linux
github教程地址: 優化一:https://github.com/xiaolongba/wireless-tech/blob/master/%E8%BD%AF%E4%BB%B6/%E7%BA%A2%E6%97%AD%E6%97%A0%E7%BA%BF%E5%BC%80%E5%8F%91%
Maven學習總結系列三:Maven入門
1.編寫POM Maven專案的核心就是pom.xml,POM(Project Object Model,專案物件模型)定義了專案的基本資訊,用於描述專案如何構建,宣告專案依賴,等等。 還記得我們第一章遇到的問題嗎? 在開發的過程中,我們需要到各個網站上下載第三方的JAR包,隨著專案的慢慢增大,JAR包
01:Docker入門與應用實戰
學完這門課程會獲得什麼? 掌握Docker核心概念 熟悉Docker工作原理 獨立使用Docker部署應用程式 接入CI/CD,實現環境標準化 入門須知: 熟悉Linux作業系統 瞭解域名解析原理 瞭解網路 第 1 章: Docker概述 Docker是
ISTQB FL初級認證系列01:ISTQB FL初級認證考試說明
ISTQB FL初級認證考試說明 考試安排 1)考試時間:每月第二週週五和第四周週日下午15:00。 2)考試地點:考試地點會選在考生比較集中的地方,如CSTQB認證培訓機構、集體報名的單位內等
Kubernetes 系列六】Kubernetes 服務發現
目錄 什麼是服務發現? 環境變數 DNS 服務 Linux 中 DNS 查詢原理 Kubernetes 中 DNS 查詢原理 除錯 DNS 服務 存根域及上游
Gin框架系列01:極速上手
## Gin是什麼? Gin是Go語言編寫的web框架,具備中介軟體、崩潰處理、JSON驗證、內建渲染等多種功能。 ## 準備工作 本系列演示所有程式碼都在Github中,感興趣的同學可以自行查閱,歡迎大家一起完善。 ```shell https://github.com/pingyeaa/golan