主頁 >  其他 > kubernetes入門

kubernetes入門

2023-05-04 08:01:15 其他

一.導言

隨著容器技術的發展,軟體界對容器管理的需求越來越迫切,于是出現了一些kubernetes(即k8s),docker swarm 等容器管理軟體,同時k8s等服務編排軟體也讓微服務變得可行,快速擴容縮容,自動處理網路配置等特性也讓k8s如火如荼,

k8s能做什么?

  • 服務發現和負載均衡,使用dns或者ip對外暴露容器服務,并提供負載均衡
  • 存盤管理,多種存盤選擇
  • 擬態擴容縮容,根據需求擴容,縮容,并且k8s會盡力達到desired state
  • 自動裝箱,比如配置每個容器能使用的CPU和RAM資源,k8s將容器分配到合適的節點以最大化利用系統資源
  • 自動處理故障,當容器失效時,能快速處理,并且不會對客戶端有影響
  • 配置和秘鑰管理

二.k8s架構及相關概念

control plane:控制臺

kube-apiserver: k8s的核心api服務,一般需要做橫向擴展

etcd: 提供一致性和高可用的的鍵值存盤,k8s用來存盤集群資料,etcd是一款用go語言撰寫的分布式kv存盤,基于raft演算法,能提供更穩定的高負載穩定讀寫能力,

kube-scheduler: 為未分配節點的pod尋找合適的節點

kube-controller-manager: 包括以下controller

  • ??node controller: 監視節點下線
  • ??job-controller: 監視Job 運行狀況
  • ??EndpointSlice controller: 即端點串列控制器,為Service 和 pod 提供連接

cloud-controller-manager: 云服務控制管理

node:節點,對應物理機或者虛擬機

kubelet: 運行在節點中的agent,確保容器運行在pod中

kube-proxy: 運行在節點中的網路代理,為Servcie提供支持

pod: k8s 抽象出來的的管理單元,包括一個或者多個容器,共享存盤,網路,埠等資源

volume: 存盤單元抽象

container:容器,比如docker

Deployment:部署,描述部署的容器,復制等資訊,一個典型的Deployment如下

    apiVersion: apps/v1 (版本)
	kind: Deployment (物件型別)
	metadata: (元資料)
	  name: nginx-deployment (name, UIDs)
	spec: (目標狀態)
	  selector:
	    matchLabels:
	      app: nginx
	  replicas: 2 # tells deployment to run 2 pods matching the template
	  template:
	    metadata:
	      labels: (labels and selector)
	        app: nginx
	    spec:
	      containers:
	      - name: nginx
	        image: nginx:1.14.2
	        ports:
	        - containerPort: 80

Service:基于pod創建對外或者對內網路服務

三.構建無狀態服務

無狀態服務:服務不依賴自身的狀態,實體的狀態資料可以維護在記憶體中,

構建步驟如下:

???0.筆者這里使用minikube進行測驗,先啟動minikube???

minikube start
minikube dashboard # 啟動后臺管理界面

1.執行部署

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: load-balancer-example
  name: hello-world
spec:
  replicas: 5
  selector:
    matchLabels:
      app.kubernetes.io/name: load-balancer-example
  template:
    metadata:
      labels:
        app.kubernetes.io/name: load-balancer-example
    spec:
      containers:
      - image: gcr.io/google-samples/node-hello:1.0
        name: hello-world
        ports:
        - containerPort: 8080
kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml

2.查看部署資訊

kubectl get deployments hello-world
kubectl describe deployments hello-world

NAME          READY   UP-TO-DATE   AVAILABLE   AGE
hello-world   5/5     5            5           12m

3.查看副本集

這里我們創建了五個副本

kubectl get replicasets
kubectl describe replicasets

NAME                         DESIRED   CURRENT   READY   AGE
hello-world-644f58f5f4       5         5         5       12m

4.創建Service暴露部署

kubectl expose deployment hello-world --type=LoadBalancer --name=my-service # LoadBalancer表示使用負載均衡的方式

5.查看Service

kubectl get services my-service

NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
my-service   LoadBalancer   10.102.184.247   <pending>     8080:31755/TCP   3s

6.查看Service詳細資訊

kubectl describe services my-service
Name:                     my-service
Namespace:                default
Labels:                   app.kubernetes.io/name=load-balancer-example
Annotations:              <none>
Selector:                 app.kubernetes.io/name=load-balancer-example
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.102.184.247
IPs:                      10.102.184.247
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31755/TCP
Endpoints:                10.244.0.87:8080,10.244.0.88:8080,10.244.0.89:8080 + 2 more... # 端點
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none

7.查看pod對應的端點

kubectl get pods --output=wide
NAME                               READY   STATUS      RESTARTS        AGE     IP            NODE       NOMINATED NODE   READINESS GATES
hello-world-644f58f5f4-2slc4       1/1     Running     0               8m46s   10.244.0.91   minikube   <none>           <none>
hello-world-644f58f5f4-jjf6w       1/1     Running     0               8m46s   10.244.0.88   minikube   <none>           <none>
hello-world-644f58f5f4-mzd5x       1/1     Running     0               8m46s   10.244.0.90   minikube   <none>           <none>
hello-world-644f58f5f4-t6cmj       1/1     Running     0               8m46s   10.244.0.89   minikube   <none>           <none>
hello-world-644f58f5f4-xlvtr       1/1     Running     0               8m46s   10.244.0.87   minikube   <none>           <none>

8.訪問服務

使用 curl http://<external-ip>:<port> 進行訪問,

<external-ip> 這里指代LoadBalancer Ingress地址,許多廠商開發了各種網關和k8s集成,

<port> 指代Service暴露的埠,

如果是minikube,直接啟動即可

?  k8s minikube service my-service
|-----------|------------|-------------|---------------------------|
| NAMESPACE |    NAME    | TARGET PORT |            URL            |
|-----------|------------|-------------|---------------------------|
| default   | my-service |        8080 | http://192.168.49.2:31755 |
|-----------|------------|-------------|---------------------------|
??  Starting tunnel for service my-service.
|-----------|------------|-------------|------------------------|
| NAMESPACE |    NAME    | TARGET PORT |          URL           |
|-----------|------------|-------------|------------------------|
| default   | my-service |             | http://127.0.0.1:53820 |
|-----------|------------|-------------|------------------------|
??  正通過默認瀏覽器打開服務 default/my-service...
?  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

三.構建有狀態服務

有狀態服務 · 服務本身依賴或者存在區域的狀態資料,這些資料需要自身持久化或者可以通過其他節點恢復,

??1.添加自定義組態檔,存盤mysql密碼

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=YOUR_PASSWORD
EOF

??2.撰寫部署mysql 和 WordPress檔案

??mysql部署檔案 application/wordpress/mysql-deployment.yaml:

apiVersion: v1
kind: Service # 部署服務
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim # 指定持久化存盤
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment # mysql部署
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass # 使用之前定義的秘鑰
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # 將該路徑的存盤映射到mysql-pv-claim
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

WordPress 部署檔案:application/wordpress/wordpress-deployment.yaml

apiVersion: v1
kind: Service # 暴露服務
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim # 指定持久化存盤
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html # 存盤路徑映射
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim

??將以上檔案寫入到kustomization.yaml中

cat <<EOF >>./kustomization.yaml
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml
EOF

??3.執行部署

kubectl apply -k ./ #確保上述檔案在當前目錄下

??查看秘鑰:

?  k8s kubectl get secrets
NAME                    TYPE     DATA   AGE
mysql-pass-kkcc2b926b   Opaque   1      3d22h

??查看PersistentVolume:

?  k8s kubectl get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound    pvc-456c2492-32bd-4d15-9753-c3ad1034c38f   20Gi       RWO            standard       3d22h
wp-pv-claim      Bound    pvc-78d63fcd-9c75-4320-97d6-4498d2915707   20Gi       RWO            standard       3d22h

??查看pod:

?  k8s kubectl get pods
NAME                               READY   STATUS      RESTARTS      AGE
wordpress-7fdfc976b9-4tx6d         1/1     Running     0             16s
wordpress-mysql-6987d65455-f44dz   1/1     Running     0             16s

??查看Service:

?  k8s kubectl get services wordpress                
NAME        TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
wordpress   LoadBalancer   10.101.95.45   <pending>     80:31798/TCP   3d22h

??運行服務,訪問 http://127.0.0.1:52503/ 即可看到服務地址

?  k8s minikube service wordpress --url
http://127.0.0.1:52503
?  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

四.網路模型

k8s給集群里面的每個pod分配集群內 IP地址,這個ip僅僅限制在集群內部使用,

  • pod之間可以互相訪問,不依賴NAT(Network Address Translation)
  • 節點上的agent(kubelet)可以和其他節點上的pod互相訪問

"IP-per-pod" model:同一個pod里面的容器共享網路命名空間,即共享ip地址,mac地址等等,這意味著pod里面的容器可以使用localhost互相訪問對方的埠,同時要求容器內的埠不能互相沖突,

  • pod里面的容器使用loopback 互相訪問
  • pod之間通過cluster-wide IP 互相訪問
  • 可以使用Service暴露服務,方便從集群外部訪問,許多廠商開發了各類網關,以支持http 應用,網站,和APIs

五.最佳實踐

  • 所有組態檔,比如Deployment, Service 應該進行版本控制,推送到git倉庫
  • 先創建Service,然后再創建Deployment,這樣pod就能獲得Service的相關資訊
  • 使用DNS server插件
  • 不要為pod指定地址埠
  • 使用語意化的標簽來進行管理應用或者部署,比如{ app.kubernetes.io/name: MyApp, tier: frontend, phase: test, deployment: v3 }

六.CRI 之 docker engine

??1.容器發展史

??2.docker 架構和底層技術

??docker 使用go語言撰寫,使用namespaces 來隔離workspace (container),當我們創建一個container,docker創建一系列的namespace來進行隔離,

??docker 使用cgroup來進行資源控制,

??3.docker 中的一些關鍵概念

  • ??每個container只包含一個行程
  • ??可以使用docker compose,組合多個container進行管理
  • ??docker提供兩種持久化方式,volumes(使用卷的方式), bind mounts(掛載)
  • ??image是分層的,并且可以快取
  • ??使用Multi-stage builds,只保留最后一階段的輸出

??4.docker最佳實踐

??image:

    • 選擇合適的base image
    • 使用Multi-stage builds,可以讓image變得更小
    • 在共享組件的基礎上構建image
    • 對image打標簽
    • 在正式環境使用volumes存盤,在開發環境使用bind mounts存盤
    • 使用CI/CD開發

??dockerfile:

    • 創建無狀態的container
    • 使用stdin 創建 Dockerfile
    • 使用.dockerignore排除檔案
    • 使用Multi-stage builds
    • 不要安裝不必要的包
    • 解耦應用,每個container只運行一個行程
    • 減少layer的數量??

七.總結

本文介紹了k8s的核心架構,和重要相關概念,并且演示了兩個典型用例,同時介紹了docker的相關知識,

八.參考

https://docs.docker.com/get-started/

https://kubernetes.io/docs/home/

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

標籤:其他

上一篇:dqwwn1-服務器弱點

下一篇:返回列表

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

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • kubernetes入門

    一.導言 隨著容器技術的發展,軟體界對容器管理的需求越來越迫切,于是出現了一些kubernetes(即k8s),docker swarm 等容器管理軟體。同時k8s等服務編排軟體也讓微服務變得可行,快速擴容縮容,自動處理網路配置等特性也讓k8s如火如荼。 k8s能做什么? 服務發現和負載均衡,使用d ......

    uj5u.com 2023-05-04 08:01:15 more
  • dqwwn1-服務器弱點

    主機發現 sudo nmap -sn 192.168.28.0/24 TCP埠掃描:sudo nmap -sT --min-rate 1000 -p- 192.168.28.34 -oA nmapscan/ports TCP埠版本掃描sudo nmap -sT -sV -sC -O -p22,8 ......

    uj5u.com 2023-05-04 07:55:49 more
  • 再一次,實作聽歌自由

    20年前,中國網民聽歌是自由的,準確點說是聽盜版歌的自由。2002年11月,百度上線MP3搜索功能,幾乎能搜索和下載到所有的歌曲。按相關的著作權法規,百度未經授權使用他人資源牟利是違法的。當時互聯網產業違法采集資料、傳播盜版是家常便飯,著作權管理形同虛設,百度順勢而為分了一塊大蛋糕。盜版音樂砸了音樂人的... ......

    uj5u.com 2023-05-04 07:39:47 more
  • 【經濟機器是如何運行的】30分鐘看懂經濟的本質(無數大佬推薦)建議

    視頻來源: https://www.bilibili.com/video/BV1qG4y157qp/?share_source=copy_web&vd_source=185624f32058093bb3ad55ee7f1c12b1 總結: 1、不要讓債務的增長速度超過收入。 當債務增長速度超過的你的 ......

    uj5u.com 2023-05-04 07:39:14 more
  • 函式呼叫堆疊的一些簡單認識

    程式的執行可以理解為連續的函式呼叫,每一個用戶態(用戶態指的是CPU指令集權限ring 0,用戶只能訪問常用CPU指令集,在應用程式中運行)行程都對應一個呼叫堆疊結構,當一個函式執行完畢后,會自動回到原先呼叫函式的位置(call指令)的下一步命令并執行,堆疊結構的作用是保存函式回傳地址、傳遞函式引數、 ......

    uj5u.com 2023-05-04 07:38:35 more
  • dqwwn1-服務器弱點

    主機發現 sudo nmap -sn 192.168.28.0/24 TCP埠掃描:sudo nmap -sT --min-rate 1000 -p- 192.168.28.34 -oA nmapscan/ports TCP埠版本掃描sudo nmap -sT -sV -sC -O -p22,8 ......

    uj5u.com 2023-05-04 07:38:21 more
  • chatGPT問答之 Webpack 5 多入口打包如何指定打包檔案名規定的檔

    前言 chatGPT越來越令人驚奇,有一些答案在百度上搜半天卻找不到你想要的,但與chatGPT的聊天中就可以非常快的得到你想要的結果,不得不說人工智能很好用下面就是我與chatGPT的聊天內容 chatGPT問答之 Webpack 5 多入口打包如何指定打包檔案名規定的檔案名 問1: Webpac ......

    uj5u.com 2023-05-03 07:33:24 more
  • Vulnhub之Gain Power靶機詳細測驗程序

    Gain Power 識別目標主機IP地址 (kali?kali)-[~/Vulnhub/Gainpower] └─$ sudo netdiscover -i eth1 -r 192.168.56.0/24 Currently scanning: 192.168.56.0/24 | Screen V ......

    uj5u.com 2023-05-03 07:33:18 more
  • python輕量級性能工具-Locust

    Locust基于python的協程機制,打破了執行緒行程的限制,可以能夠在一臺測驗機上跑高并發 性能測驗基礎 1.快慢:衡量系統的處理效率:回應時間 2.多少:衡量系統的處理能力:單位時間內能處理多少個事務(tps) 性能測驗根據測驗需求最常見的分為下面三類 1 負載測驗load testing 不斷 ......

    uj5u.com 2023-05-03 07:27:58 more
  • 基于ChatGPT用AI實作自然對話

    1.概述 ChatGPT是當前自然語言處理領域的重要進展之一,通過預訓練和微調的方式,ChatGPT可以生成高質量的文本,可應用于多種場景,如智能客服、聊天機器人、語音助手等。本文將詳細介紹ChatGPT的原理、實戰演練和流程圖,幫助讀者更好地理解ChatGPT技術的應用和優勢。 2.內容 在當今快 ......

    uj5u.com 2023-05-01 07:34:37 more