1. 程式人生 > >Kubernetes系列01:Kubernetes入門

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

[
[email protected]
docker]# kubectl get rc
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狀態
[
[email protected]
docker]# kubectl get pods
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.
[
[email protected]
docker]# kubectl get pods
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系列01Kubernetes入門

轉載的朋友請寫上來源,很多大量的文字都是我自己敲出來,付出很多辛苦。 最近在學習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包

01Docker入門與應用實戰

學完這門課程會獲得什麼? 掌握Docker核心概念 熟悉Docker工作原理 獨立使用Docker部署應用程式 接入CI/CD,實現環境標準化 入門須知: 熟悉Linux作業系統 瞭解域名解析原理 瞭解網路 第 1 章: Docker概述 Docker是

ISTQB FL初級認證系列01ISTQB 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