国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

k8s快速入門(mén)

這篇具有很好參考價(jià)值的文章主要介紹了k8s快速入門(mén)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、Kubernetes(K8S)簡(jiǎn)介

1、概念

官網(wǎng):https://kubernetes.io/zh-cn/docs/home/

1.1 Kubernetes (K8S) 是什么

它是一個(gè)為 容器化 應(yīng)用提供集群部署和管理的開(kāi)源工具,由 Google 開(kāi)發(fā)。K8S 是負(fù)責(zé)自動(dòng)化運(yùn)維管理多個(gè)跨機(jī)器 Docker 程序的集群

1.2 核心特性

  • 服務(wù)發(fā)現(xiàn)與負(fù)載均衡:無(wú)需修改你的應(yīng)用程序即可使用陌生的服務(wù)發(fā)現(xiàn)機(jī)制
  • 存儲(chǔ)編排:自動(dòng)掛載所選存儲(chǔ)系統(tǒng),包括本地存儲(chǔ)
  • Secret和配置管理:部署更新Secrets和應(yīng)用程序的配置時(shí)不必重新構(gòu)建容器鏡像,且不必將軟件堆棧配置中的秘密信息暴露出來(lái)
  • 批量執(zhí)行:除了服務(wù)之外,Kubernetes還可以管理你的批處理和CI工作負(fù)載,在期望時(shí)替換掉失效的容器
  • 水平擴(kuò)縮:使用一個(gè)簡(jiǎn)單的命令、一個(gè)UI或基于CPU使用情況自動(dòng)對(duì)應(yīng)用程序進(jìn)行擴(kuò)縮
  • 自動(dòng)化上線和回滾:Kubernetes會(huì)分步驟地將針對(duì)應(yīng)用或其配置的更改上線,同時(shí)監(jiān)視應(yīng)用程序運(yùn)行狀況以確保你不會(huì)同時(shí)終止所有實(shí)例
  • 自動(dòng)裝箱:根據(jù)資源需求和其他約束自動(dòng)放置容器,同時(shí)避免影響可用性
  • 自我修復(fù):重新啟動(dòng)失敗的容器,在節(jié)點(diǎn)死亡時(shí)替換并重新調(diào)度容器,殺死不響應(yīng)用戶定義的健康檢查的容器

1.3 部署方案

傳統(tǒng)部署方式

應(yīng)用直接在物理機(jī)上部署,機(jī)器資源分配不好控制,出現(xiàn)Bug時(shí),可能機(jī)器的大部分資源被某個(gè)應(yīng)用占用,導(dǎo)致其他應(yīng)用無(wú)法正常運(yùn)行,無(wú)法做到應(yīng)用隔離

虛擬機(jī)部署

在單個(gè)物理機(jī)上運(yùn)行多個(gè)虛擬機(jī),每個(gè)虛擬機(jī)都是完整獨(dú)立的系統(tǒng),性能損耗大

容器部署

所有容器共享主機(jī)的系統(tǒng),輕量級(jí)的虛擬機(jī),性能損耗小,資源隔離,CPU和內(nèi)存可按需分配;例如k8s可以輕松管理百萬(wàn)千萬(wàn)臺(tái)機(jī)器的集群,可以為你提供集中式的管理集群機(jī)器和應(yīng)用,不停機(jī)的灰度更新,確保高可用、高性能、高擴(kuò)展

2、Kubernetes 集群架構(gòu)

2.1 架構(gòu)

k8s快速入門(mén)

  • master

    主節(jié)點(diǎn),控制平臺(tái),不需要很高性能,不跑任務(wù),通常一個(gè)就行了,也可以開(kāi)多個(gè)主節(jié)點(diǎn)來(lái)提高集群可用度。

  • worker

    工作節(jié)點(diǎn),可以是虛擬機(jī)或物理計(jì)算機(jī),任務(wù)都在這里跑,機(jī)器性能需要好點(diǎn);通常都有很多個(gè),可以不斷加機(jī)器擴(kuò)大集群;每個(gè)工作節(jié)點(diǎn)由主節(jié)點(diǎn)管理

2.2 重要概念 Pod

K8S 調(diào)度、管理的最小單位,一個(gè) Pod 可以包含一個(gè)或多個(gè)容器,每個(gè) Pod 有自己的虛擬IP。一個(gè)工作節(jié)點(diǎn)可以有多個(gè) pod,主節(jié)點(diǎn)會(huì)考量負(fù)載自動(dòng)調(diào)度 pod 到哪個(gè)節(jié)點(diǎn)運(yùn)行

k8s快速入門(mén)

2.3 Kubernetes 組件

  • kube-apiserver K8S 的請(qǐng)求入口服務(wù)。API Server 負(fù)責(zé)接收 K8S 所有請(qǐng)求(來(lái)自 UI 界面或者 CLI 命令行工具),然后,API Server 根據(jù)用戶的具體請(qǐng)求,去通知其他組件干活
  • etcd K8S 的存儲(chǔ)服務(wù)。etcd 存儲(chǔ)了 K8S 的關(guān)鍵配置和用戶配置,K8S 中僅 API Server 才具備讀寫(xiě)權(quán)限,其他組件必須通過(guò) API Server 的接口才能讀寫(xiě)數(shù)據(jù)
  • kube-scheduler K8S 所有 Worker Node 的調(diào)度器。當(dāng)用戶要部署服務(wù)時(shí),Scheduler 會(huì)選擇最合適的 Worker Node(服務(wù)器)來(lái)部署
  • controller Manager K8S 所有 Worker Node 的監(jiān)控器。Controller Manager 有很多具體的Controller, Node Controller、Service Controller、Volume Controller 等。Controller 負(fù)責(zé)監(jiān)控和調(diào)整在Worker Node 上部署的服務(wù)的狀態(tài),比如用戶要求 A 服務(wù)部署 2 個(gè)副本,那么當(dāng)其中一個(gè)服務(wù)掛了的時(shí)候,Controller 會(huì)馬上調(diào)整,讓 Scheduler 再選擇一個(gè) Worker Node 重新部署服務(wù)
  • cloud-controller 與云服務(wù)商交互
  • Kubelet Worker Node 的監(jiān)視器,以及與 Master Node 的通訊器。Kubelet 是 Master Node 安插在Worker Node 上的"眼線",它會(huì)定期向 Master Node 匯報(bào)自己 Node 上運(yùn)行的服務(wù)的狀態(tài),并接受來(lái)自Master Node 的指示采取調(diào)整措施。負(fù)責(zé)控制所有容器的啟動(dòng)停止,保證節(jié)點(diǎn)工作正常。
  • Kube-Proxy K8S 的網(wǎng)絡(luò)代理。Kube-Proxy 負(fù)責(zé) Node 在 K8S 的網(wǎng)絡(luò)通訊、以及對(duì)外部網(wǎng)絡(luò)流量的負(fù)載均衡
  • Container Runtime** Worker Node 的運(yùn)行環(huán)境**。即安裝了容器化所需的軟件環(huán)境確保容器化程序能夠跑起來(lái),比如 Docker Engine運(yùn)行環(huán)境

k8s快速入門(mén)

二、Kubernetes集群安裝

默認(rèn)已經(jīng)提前安裝好Docker,docker安裝可以參考:docker學(xué)習(xí)筆記

1、安裝方式介紹

  • minikube

    只是一個(gè) K8S 集群模擬器,只有一個(gè)節(jié)點(diǎn)的集群,只為測(cè)試用,master 和 worker 都在一起

  • 直接用云平臺(tái) Kubernetes (阿里/騰訊)

    可視化搭建,只需簡(jiǎn)單幾步就可以創(chuàng)建好一個(gè)集群。

    優(yōu)點(diǎn):安裝簡(jiǎn)單,生態(tài)齊全,負(fù)載均衡器、存儲(chǔ)等都給你配套好,簡(jiǎn)單操作就搞定

  • 裸機(jī)安裝(Bare Metal)

    至少需要兩臺(tái)機(jī)器(主節(jié)點(diǎn)、工作節(jié)點(diǎn)個(gè)一臺(tái)),需要自己安裝 Kubernetes 組件,配置會(huì)稍微麻煩點(diǎn)。

    可以到各云廠商按時(shí)租用服務(wù)器,費(fèi)用低,用完就銷毀。

    缺點(diǎn):配置麻煩,缺少生態(tài)支持,例如負(fù)載均衡器、云存儲(chǔ)。

2、minikubute安裝

官網(wǎng)安裝:https://minikube.sigs.k8s.io/docs/start/
Minikube:搭建部署單機(jī) Kubernetes

minikube安裝非常簡(jiǎn)單,支持各種平臺(tái),建議直接裸機(jī)(個(gè)人虛擬機(jī)安裝一直有問(wèn)題)

# 啟動(dòng)集群,據(jù)說(shuō)不加版本會(huì)報(bào)錯(cuò)(我還是啟動(dòng)不了)
minikube start --kubernetes-version=v1.23.0
# 查看節(jié)點(diǎn)。kubectl 是一個(gè)用來(lái)跟 K8S 集群進(jìn)行交互的命令行工具
kubectl get node
# 停止集群
minikube stop
# 清空集群
minikube delete --all
# 安裝集群可視化 Web UI 控制臺(tái)
minikube dashboard

minikube和云平臺(tái)不多贅述,例如騰訊云的彈性容器服務(wù) EKS,這里主要講述邏輯集群的安裝

3、裸機(jī)搭建(Bare Metal)

k8s集群搭建參考:https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY#nav_3

3.1 概念介紹

主節(jié)點(diǎn)需要組件

  • docker(也可以是其他容器運(yùn)行時(shí))
  • kubectl 集群命令行交互工具
  • kubeadm 集群初始化工具

**工作節(jié)點(diǎn)需要組件 **文檔

  • docker(也可以是其他容器運(yùn)行時(shí))
  • kubelet 管理 Pod 和容器,確保他們健康穩(wěn)定運(yùn)行
  • kube-proxy 網(wǎng)絡(luò)代理,負(fù)責(zé)網(wǎng)絡(luò)相關(guān)的工作

3.2 集群安裝

這里我基于centos7創(chuàng)建了三臺(tái)虛擬機(jī)(2核4G,網(wǎng)絡(luò)使用nat),以下是所有節(jié)點(diǎn)的配置,權(quán)限不夠的話使用sudo提升權(quán)限

# 每個(gè)節(jié)點(diǎn)分別設(shè)置對(duì)應(yīng)主機(jī)名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

# 所有節(jié)點(diǎn)都修改 hosts
vim /etc/hosts
192.168.249.241 node1
192.168.249.242 node2
192.168.249.240 master

# 所有節(jié)點(diǎn)關(guān)閉 SELinux
# 臨時(shí)關(guān)閉
setenforce 0
# 永久關(guān)閉
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
# 查看selinux狀態(tài)
getenforce

# k8s不需要swap分區(qū),如果安裝Linux系統(tǒng)時(shí)創(chuàng)建了swap分區(qū),那么就需要禁用swap
# 臨時(shí)關(guān)閉swap分區(qū)
swapoff -a
# 修改配置文件永久關(guān)閉swap分區(qū) ,或者vim /etc/fstab 刪除或注釋掉帶有swap的行
sed -ri 's/.*swap.*/#&/' /etc/fstab

# 所有節(jié)點(diǎn)確保防火墻關(guān)閉,確保網(wǎng)絡(luò)通信
systemctl stop firewalld
systemctl disable firewalld

# 設(shè)置時(shí)間同步
sudo yum install ntpdate -y
sudo ntpdate time.windows.com


# 添加 k8s 安裝源
cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
mv kubernetes.repo /etc/yum.repos.d/

# 添加 Docker 安裝源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安裝所需組件(所有節(jié)點(diǎn))
yum install -y kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4 docker-ce

# 啟動(dòng) kubelet、docker,并設(shè)置開(kāi)機(jī)啟動(dòng)
systemctl enable kubelet
systemctl start kubelet
systemctl enable docker
systemctl start docker


# 修改 docker 配置
# kubernetes 官方推薦 docker 等使用 systemd 作為 cgroupdriver,否則 kubelet 啟動(dòng)不了
cat <<EOF > daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
mv daemon.json /etc/docker/
# 重啟生效
systemctl daemon-reload
systemctl restart docker

在主節(jié)點(diǎn)master初始化集群,init的文檔

# 初始化集群控制臺(tái) Control plane
# 失敗了可以用 sudo kubeadm reset 重置
# 這里記得加上子網(wǎng)分配,教程不加也可以,可以試試
sudo kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr 10.244.0.0/16
#sudo kubeadm init --apiserver-advertise-address=192.168.249.139 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
# 記得把 kubeadm join xxx 保存起來(lái)
# 忘記了重新獲?。簁ubeadm token create --print-join-command

# 復(fù)制授權(quán)文件,以便 kubectl 可以有權(quán)限訪問(wèn)集群
# 如果你其他節(jié)點(diǎn)需要訪問(wèn)集群,需要從主節(jié)點(diǎn)復(fù)制這個(gè)文件過(guò)去其他節(jié)點(diǎn)
# 如果是普通用戶
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 如果是root用戶
export KUBECONFIG=/etc/kubernetes/admin.conf

# 在其他機(jī)器上創(chuàng)建 ~/.kube/config 文件也能通過(guò) kubectl 訪問(wèn)到集群

# 如果node節(jié)點(diǎn)添加進(jìn)集群失敗,可以刪除節(jié)點(diǎn)重新添加
# 要?jiǎng)h除 -node1 這個(gè)節(jié)點(diǎn),首先在 master 節(jié)點(diǎn)上依次執(zhí)行以下兩個(gè)命令
kubectl drain node1 --delete-local-data --force --ignore-daemonsets
kubectl delete node node1
# 執(zhí)行后通過(guò) kubectl get node 命令可以看到 node1 已被成功刪除,接著在 k8s-node1 這個(gè) Node 節(jié)點(diǎn)上執(zhí)行如下命令,這樣該節(jié)點(diǎn)即完全從 k8s 集群中脫離開(kāi)來(lái),之后就可以重新執(zhí)行命令添加到集群
kubeadm reset

然后把工作節(jié)點(diǎn)加入集群(只在工作節(jié)點(diǎn)跑)

sudo kubeadm join 192.168.249.140:6443 --token 5f20z7.9rbjijmnkhpz0sj2 \
        --discovery-token-ca-cert-hash sha256:b6b6b1d84ca8a0711667d654e8a676c0e17703715c5b16074896eecedbf8ca01

最后安裝網(wǎng)絡(luò)插件,否則 node 是 NotReady 狀態(tài)(主節(jié)點(diǎn)跑)

# 查看狀態(tài)
kubectl get nodes
# 網(wǎng)絡(luò)插件,用來(lái)結(jié)點(diǎn)通信的,
# 很有可能國(guó)內(nèi)網(wǎng)絡(luò)訪問(wèn)不到這個(gè)資源,你可以網(wǎng)上找找國(guó)內(nèi)的源安裝 flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 這里一個(gè)方法是進(jìn)入該網(wǎng)站手動(dòng)講內(nèi)容復(fù)制下來(lái),把內(nèi)容保存到linux中命名kube-flannel.yml
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
# 執(zhí)行
kubectl apply -f kube-flannel.yml

3.3 踩坑之路

首先了解一下基本的命令

# 查看所有的詳細(xì)信息
kubectl get pod -A -owide
# 查看某一個(gè)容器詳細(xì)運(yùn)行狀態(tài),-n后跟的是命名空間,排查錯(cuò)誤用
kubectl describe pod kube-flannel-ds-wclwt -n kube-flannel
# 查看日志
kubectl logs -f --tail 200 -n kube-flannel kube-flannel-ds-5bmpl

問(wèn)題一

手動(dòng)導(dǎo)入網(wǎng)絡(luò)插件后通過(guò)查看日志發(fā)現(xiàn)鏡像無(wú)法拉取,于是手動(dòng)拉取導(dǎo)入,然后用tag打上與yml文件中的鏡像一模一樣的名字,這里我每個(gè)結(jié)點(diǎn)都是這樣操作(按理說(shuō)會(huì)自動(dòng)同步過(guò)去其他結(jié)點(diǎn),但是每個(gè)結(jié)點(diǎn)都報(bào)錯(cuò)了,所以我手動(dòng)下載了;當(dāng)然換個(gè)國(guó)內(nèi)源也可以)

# 下載地址
https://github.com/flannel-io/flannel
# 比如yml中寫(xiě)的是docker.io/rancher/mirrored-flannelcni-flannel:v0.20.0,首先下載對(duì)應(yīng)的包
docker load < flanneld-v0.20.0-amd64.docker
# 查看一下
sudo docker images
# 找到對(duì)應(yīng)的鏡像打上對(duì)應(yīng)標(biāo)簽
sudo docker tag quay.io/coreos/flannel:v0.20.0-amd64 docker.io/rancher/mirrored-flannelcni-flannel:v0.20.0

問(wèn)題二

手動(dòng)下載后,查看describe日志發(fā)現(xiàn)能成功拉去鏡像,但是容器無(wú)法啟動(dòng),查看logs日志發(fā)現(xiàn)說(shuō)沒(méi)有分配子網(wǎng)podCIDR,通過(guò)kubeadm init初始化master節(jié)點(diǎn)時(shí),flannel網(wǎng)絡(luò)插件需要確保初始化命令配置了podCIDR如下啟動(dòng)參數(shù),–pod-network-cidr=172.18.0.0/16

參考:k8s集群flannel部署錯(cuò)誤異常排查:pod cidr not assigned

問(wèn)題三

如果你運(yùn)行 kubectl describe pod/pod-name 發(fā)現(xiàn) Events 中有下面這個(gè)錯(cuò)誤networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env: no such file or directory那么在每個(gè)節(jié)點(diǎn)創(chuàng)建文件/run/flannel/subnet.env寫(xiě)入以下內(nèi)容,配置后等待一會(huì)就好了(用來(lái)配置每個(gè)結(jié)點(diǎn)的子網(wǎng)信息)

FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

4、快速體驗(yàn)

# 創(chuàng)建一次deployment部署
kubectl create deployment nginx --image=nginx
kubectl get deployment
kubectl get pod
# 創(chuàng)建service(端口映射)
kubectl expose deployment nginx --port=80 --type=NodePort

kubectl get pod,svc -o wide
# 訪問(wèn)Nginx地址: http://任意節(jié)點(diǎn)的ip:圖中Nginx的對(duì)外映射端口,http://192.168.249.240:30433

# 刪除pod和service(端口映射)
kubectl delete deployment nginx
kubectl delete svc/nginx

5、可視化安裝

5.1 Kuboard v2 - kubernetes(推薦)

參考:安裝 Kuboard v2

# 安裝 Kuboard
kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml
# 查看運(yùn)行狀態(tài)
kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system


# 獲取管理員token
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

#Kuboard Service 使用了 NodePort 的方式暴露服務(wù),NodePort 為 32567;您可以按如下方式訪問(wèn) Kuboard。
# http://任意一個(gè)Worker節(jié)點(diǎn)的IP地址:32567/

5.2 Kubernetes Dashboard

參考:Kubernetes Dashboard安裝/部署和訪問(wèn) Kubernetes 儀表板(Dashboard)

Kubernetes Dashboard 是 Kubernetes 的官方 Web UI。使用 Kubernetes Dashboard可以

  • 向 Kubernetes 集群部署容器化應(yīng)用
  • 診斷容器化應(yīng)用的問(wèn)題
  • 管理集群的資源
  • 查看集群上所運(yùn)行的應(yīng)用程序
  • 創(chuàng)建、修改Kubernetes 上的資源(例如 Deployment、Job、DaemonSet等)
  • 展示集群上發(fā)生的錯(cuò)誤
# 安裝 Kubernetes Dashboard
kubectl apply -f https://kuboard.cn/install-script/k8s-dashboard/v2.0.0-beta5.yaml

# Kubernetes Dashboard 當(dāng)前,只支持使用 Bearer Token登錄
# 創(chuàng)建 ServiceAccount 和 ClusterRoleBinding
kubectl apply -f https://kuboard.cn/install-script/k8s-dashboard/auth.yaml

# 獲取Bearer Token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
# 執(zhí)行代理命令
kubectl proxy
# 如需要使用 nodePort 或 Ingress 的方式訪問(wèn) Kubernetes Dashboard 請(qǐng)配置正確的 https 證書(shū),或者使用 Firefox 瀏覽器,并忽略 HTTPS 校驗(yàn)錯(cuò)誤。
# 訪問(wèn)路徑,將上一個(gè)步驟中獲得的 Token 輸入到登錄界面中,點(diǎn)擊 Sign in 按鈕,完成登錄
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

三、集群服務(wù)部署

1、部署應(yīng)用Demo

部署一個(gè) nodejs web 應(yīng)用,源碼地址:Github

# 查看pod狀態(tài)
kubectl get pod -owide
# 運(yùn)行一個(gè)pod
kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1
# 通過(guò)yaml創(chuàng)建k8sPod
kubectl apply -f pod.yaml
kubectl apply -f deployment.yaml

創(chuàng)建pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  # 定義容器,可以多個(gè)
  containers:
    - name: test-k8s # 容器名字
      image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 鏡像

創(chuàng)建deployment.yaml文件

apiVersion: apps/v1
# 定義資源的類型/角色,deployment為副本控制器,此處資源類型可以是Deployment、Job、Ingress、Service等
kind: Deployment
metadata:
  # 定義資源的名稱,在同一個(gè)namespace空間中必須是唯一的
  name: test-k8s
spec:
  replicas: 2
  # 用來(lái)查找關(guān)聯(lián)的 Pod,所有標(biāo)簽都匹配才行
  selector:
    matchLabels:
      app: test-k8s
  # 定義 Pod 相關(guān)數(shù)據(jù)
  template:
    metadata:
      labels:
        app: test-k8s
    spec:
      # 定義容器,可以多個(gè)
      containers:
      - name: test-k8s # 容器名字
        image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 鏡像

命令行彈性伸縮,k8s會(huì)自動(dòng)根據(jù)結(jié)點(diǎn)情況部署

# 命令行彈性擴(kuò)容,也可以在yaml中進(jìn)行編寫(xiě)
kubectl scale deployment test-k8s --replicas=3
# 修改鏡像
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error
# 把集群內(nèi)端口某個(gè)pod映射到節(jié)點(diǎn)
kubectl port-forward test-k8s-5699487f75-bg82t 8090:8080
# 在master結(jié)點(diǎn)測(cè)試訪問(wèn),這只是其中一個(gè)容器的,外網(wǎng)不能進(jìn)行訪問(wèn)
curl localhost:8090

2、常用命令詳情

# 部署應(yīng)用
kubectl apply -f app.yaml
# 查看 deployment
kubectl get deployment
# 查看 pod
kubectl get pod -o wide
# 查看 pod 詳情
kubectl describe pod pod-name
# 查看 log
kubectl logs pod-name [-f]
# 進(jìn)入 Pod 容器終端, -c container-name 可以指定進(jìn)入哪個(gè)容器。
kubectl exec -it pod-name -- bash
# 伸縮擴(kuò)展副本
kubectl scale deployment test-k8s --replicas=5
# 把集群內(nèi)端口映射到節(jié)點(diǎn)
kubectl port-forward pod-name 8090:8080
# 查看歷史
kubectl rollout history deployment test-k8s
# 回到上個(gè)版本
kubectl rollout undo deployment test-k8s
# 回到指定版本
kubectl rollout undo deployment test-k8s --to-revision=2
# 刪除部署
kubectl delete deployment test-k8s

# =============更多命令============
# 查看全部
kubectl get all
# 重新部署
kubectl rollout restart deployment test-k8s
# 命令修改鏡像,--record 表示把這個(gè)命令記錄到操作歷史中
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record
# 暫停運(yùn)行,暫停后,對(duì) deployment 的修改不會(huì)立刻生效,恢復(fù)后才應(yīng)用設(shè)置
kubectl rollout pause deployment test-k8s
# 恢復(fù)
kubectl rollout resume deployment test-k8s
# 輸出到文件
kubectl get deployment test-k8s -o yaml >> app2.yaml
# 刪除全部資源
kubectl delete all --all

3、概念

更多官網(wǎng)關(guān)于 Deployment 的介紹,將 Pod 指定到某個(gè)節(jié)點(diǎn)運(yùn)行:nodeselector,限定 CPU、內(nèi)存總量:文檔

3.1 工作負(fù)載分類

https://kubernetes.io/zh/docs/concepts/workloads/

  • Deployment

    適合無(wú)狀態(tài)應(yīng)用,所有pod等價(jià),可替代

  • StatefulSet

    有狀態(tài)的應(yīng)用,適合數(shù)據(jù)庫(kù)這種類型。

  • DaemonSet

    在每個(gè)節(jié)點(diǎn)上跑一個(gè) Pod,可以用來(lái)做節(jié)點(diǎn)監(jiān)控、節(jié)點(diǎn)日志收集等

  • Job & CronJob

    Job 用來(lái)表達(dá)的是一次性的任務(wù),而 CronJob 會(huì)根據(jù)其時(shí)間規(guī)劃反復(fù)運(yùn)行。

3.2 存在問(wèn)題

  • 每次只能訪問(wèn)一個(gè) pod,沒(méi)有負(fù)載均衡自動(dòng)轉(zhuǎn)發(fā)到不同 pod
  • 訪問(wèn)還需要端口轉(zhuǎn)發(fā)
  • Pod 重創(chuàng)后 IP 變了,名字也變了

四、Service

1、概念

https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#headless-services

  • Service 通過(guò) label 關(guān)聯(lián)對(duì)應(yīng)的 Pod
  • Servcie 生命周期不跟 Pod 綁定,不會(huì)因?yàn)?Pod 重創(chuàng)改變 IP
  • 提供了負(fù)載均衡功能,自動(dòng)轉(zhuǎn)發(fā)流量到不同 Pod
  • 可對(duì)集群外部提供訪問(wèn)端口
  • 集群內(nèi)部可通過(guò)服務(wù)名字訪問(wèn)

k8s快速入門(mén)

2、Service簡(jiǎn)單Demo

首先創(chuàng)建service.yaml

apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    # 要和pod對(duì)應(yīng)
    app: test-k8s
  # 服務(wù)默認(rèn)是這個(gè)
  type: ClusterIP
  ports:
    - port: 8080        # 本 Service 的端口
      targetPort: 8080  # 容器端口

然后進(jìn)行訪問(wèn)測(cè)試

# 創(chuàng)建service
kubectl apply -f service.yaml
# 查看服務(wù)
kubectl get service
kubectl get svc
# 查看服務(wù)詳情,可以發(fā)現(xiàn) Endpoints 是各個(gè) Pod 的 IP,也就是他會(huì)把流量轉(zhuǎn)發(fā)到這些節(jié)點(diǎn)
kubectl describe svc test-k8s
# 服務(wù)的默認(rèn)類型是ClusterIP,只能在集群內(nèi)部訪問(wèn),我們可以進(jìn)入到 Pod 里面訪問(wèn)
kubectl exec -it pod-name -- bash
curl http://test-k8s:8080
# 如果要在集群外部訪問(wèn),可以通過(guò)端口轉(zhuǎn)發(fā)實(shí)現(xiàn)(只適合臨時(shí)測(cè)試用)
kubectl port-forward service/test-k8s 8888:8080
curl http://localhost:8080

3、對(duì)外暴露服務(wù)(重要)

上面我們是通過(guò)端口轉(zhuǎn)發(fā)的方式可以在外面訪問(wèn)到集群里的服務(wù),如果想要直接把集群服務(wù)暴露出來(lái),我們可以使用NodePortLoadbalancer 類型的 Service

apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  # 默認(rèn) ClusterIP 集群內(nèi)可訪問(wèn),NodePort 節(jié)點(diǎn)可訪問(wèn),LoadBalancer 負(fù)載均衡模式(需要負(fù)載均衡器才可用)
  type: NodePort
  ports:
    - port: 8080        # 本 Service 的端口
      targetPort: 8080  # 容器端口
      nodePort: 31000   # 節(jié)點(diǎn)端口,范圍固定 30000 ~ 32767

應(yīng)用配置 kubectl apply -f service.yaml;在節(jié)點(diǎn)上,我們可以 curl http://localhost:31000 或者curl http://[你的物理ip]:31000訪問(wèn)到應(yīng)用并且是有負(fù)載均衡的,網(wǎng)頁(yè)的信息可以看到被轉(zhuǎn)發(fā)到了不同的 Pod(可能有緩存)

Loadbalancer 也可以對(duì)外提供服務(wù),這需要一個(gè)負(fù)載均衡器的支持,因?yàn)樗枰梢粋€(gè)新的 IP 對(duì)外服務(wù),否則狀態(tài)就一直是 pendding,這個(gè)很少用了,后面我們會(huì)講更高端的 Ingress 來(lái)代替它。

4、多端口

https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#multi-port-services

多端口時(shí)必須配置 name

apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  type: NodePort
  ports:
    - port: 8080        # 本 Service 的端口
      name: test-k8s    # 必須配置
      targetPort: 8080  # 容器端口
      nodePort: 31000   # 節(jié)點(diǎn)端口,范圍固定 30000 ~ 32767
    - port: 8090
      name: test-other
      targetPort: 8090
      nodePort: 32000

5、總結(jié)

  • ClusterIP

    默認(rèn)的,僅在集群內(nèi)可用

  • NodePort

    暴露端口到節(jié)點(diǎn),提供了集群外部訪問(wèn)的入口,端口范圍固定 30000 ~ 32767

  • LoadBalancer

    需要負(fù)載均衡器(通常都需要云服務(wù)商提供,裸機(jī)可以安裝 METALLB 測(cè)試)會(huì)額外生成一個(gè) IP 對(duì)外服務(wù)K8S 支持的負(fù)載均衡器:負(fù)載均衡器

  • Headless

    適合數(shù)據(jù)庫(kù),clusterIp 設(shè)置為 None 就變成 Headless 了,不會(huì)再分配 IP,后面會(huì)再講到具體用法

五、StatefulSet

1、StatefulSet介紹

1.1 概念

StatefulSet 是用來(lái)管理有狀態(tài)的應(yīng)用,例如數(shù)據(jù)庫(kù)。 前面我們部署的應(yīng)用,都是不需要存儲(chǔ)數(shù)據(jù),不需要記住狀態(tài)的,可以隨意擴(kuò)充副本,每個(gè)副本都是一樣的,可替代的。 而像數(shù)據(jù)庫(kù)、Redis 這類有狀態(tài)的,則不能隨意擴(kuò)充副本。StatefulSet 會(huì)固定每個(gè) Pod 的名字

1.2 特性

  • Service 的 CLUSTER-IP 是空的,Pod 名字也是固定的。
  • Pod 創(chuàng)建和銷毀是有序的,創(chuàng)建是順序的,銷毀是逆序的。
  • Pod 重建不會(huì)改變名字,除了IP,所以不要用IP直連

2、部署 StatefulSet 類型的 Mongodb

創(chuàng)建statefulset和service

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  serviceName: mongodb
  replicas: 3
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          #IfNotPresent 僅本地沒(méi)有鏡像時(shí)才遠(yuǎn)程拉,Always 永遠(yuǎn)都是從遠(yuǎn)程拉,Never 永遠(yuǎn)只用本地鏡像,本地沒(méi)有則報(bào)錯(cuò)
          imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb
spec:
  selector:
    app: mongodb
  type: ClusterIP
  # HeadLess
  clusterIP: None
  ports:
    - port: 27017
      targetPort: 27017

操作,這里的test-k8s鏡像使用了ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v3-mongo

# 擴(kuò)容
kubectl scale --replicas=5 statefulset mongodb
# 查看狀態(tài)信息
kubectl get endpoints mongodb -o yaml

# 訪問(wèn)時(shí),如果直接使用 Service 名字連接,會(huì)隨機(jī)轉(zhuǎn)發(fā)請(qǐng)求
# 要連接指定 Pod,可以這樣pod-name.service-name

# 運(yùn)行一個(gè)臨時(shí) Pod 連接數(shù)據(jù)測(cè)試下
kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash

# 訪問(wèn)某一個(gè)mongodb
mongo --host mongodb-0.mongodb

show dbs
use test
db.users.save({'_id':'shawn','name':'shawn22'})
db.users.find()

# 查看集權(quán)狀態(tài)
kubectl get all

六、數(shù)據(jù)持久化

1、概念

kubernetes 集群不會(huì)為你處理數(shù)據(jù)的存儲(chǔ),我們可以為數(shù)據(jù)庫(kù)掛載一個(gè)磁盤(pán)來(lái)確保數(shù)據(jù)的安全。可以選擇云存儲(chǔ)、本地磁盤(pán)、NFS。

  • 本地磁盤(pán):可以掛載某個(gè)節(jié)點(diǎn)上的目錄,但是這需要限定 pod 在這個(gè)節(jié)點(diǎn)上運(yùn)行
  • 云存儲(chǔ):不限定節(jié)點(diǎn),不受集群影響,安全穩(wěn)定;需要云服務(wù)商提供,裸機(jī)集群是沒(méi)有的。
  • NFS:不限定節(jié)點(diǎn),不受集群影響

2、hostPath 掛載示例

文檔:https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/#hostpath

把節(jié)點(diǎn)上的一個(gè)目錄掛載到 Pod,但是已經(jīng)不推薦使用了,該方法配置方式簡(jiǎn)單,需要手動(dòng)指定 Pod 跑在某個(gè)固定的節(jié)點(diǎn)。僅供單節(jié)點(diǎn)測(cè)試使用;不適用于多節(jié)點(diǎn)集群

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  serviceName: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          # IfNotPresent 僅本地沒(méi)有鏡像時(shí)才遠(yuǎn)程拉,Always 永遠(yuǎn)都是從遠(yuǎn)程拉,Never 永遠(yuǎn)只用本地鏡像,本地沒(méi)有則報(bào)錯(cuò)
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /data/db # 容器里面的掛載路徑
              name: mongo-data    # 卷名字,必須跟下面定義的名字一致
      volumes:
        - name: mongo-data              # 卷名字
          hostPath:
            path: /data/mongo-data      # 節(jié)點(diǎn)上的路徑
            type: DirectoryOrCreate     # 指向一個(gè)目錄,不存在時(shí)自動(dòng)創(chuàng)建

創(chuàng)建好數(shù)據(jù)后重啟kubectl rollout restart statefulset mongodb,發(fā)現(xiàn)數(shù)據(jù)還在,同時(shí)進(jìn)入結(jié)點(diǎn),可以發(fā)現(xiàn)數(shù)據(jù)保存在/data/db,而進(jìn)入該結(jié)點(diǎn)的宿主機(jī),發(fā)現(xiàn)數(shù)據(jù)映射在/data/mongo-data

3、高級(jí)抽象掛載

3.1 概述

k8s快速入門(mén)

  • 更好的分工,運(yùn)維人員負(fù)責(zé)提供好存儲(chǔ),開(kāi)發(fā)人員不需要關(guān)注磁盤(pán)細(xì)節(jié),只需要寫(xiě)一個(gè)申請(qǐng)單。
  • 方便云服務(wù)商提供不同類型的,配置細(xì)節(jié)不需要開(kāi)發(fā)者關(guān)注,只需要一個(gè)申請(qǐng)單。
  • 動(dòng)態(tài)創(chuàng)建,開(kāi)發(fā)人員寫(xiě)好申請(qǐng)單后,供應(yīng)商可以根據(jù)需求自動(dòng)創(chuàng)建所需存儲(chǔ)卷。

3.2 各個(gè)層級(jí)表述

Storage Class (SC)

將存儲(chǔ)卷劃分為不同的種類,例如:SSD,普通磁盤(pán),本地磁盤(pán),按需使用。文檔

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  iopsPerGB: "10"
  fsType: ext4

Persistent Volume (PV)

描述卷的具體信息,例如磁盤(pán)大小,訪問(wèn)模式。文檔,類型,Local 示例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodata
spec:
  capacity:
    storage: 2Gi
  volumeMode: Filesystem  # Filesystem(文件系統(tǒng)) Block(塊)
  accessModes:
    - ReadWriteOnce       # 卷可以被一個(gè)節(jié)點(diǎn)以讀寫(xiě)方式掛載
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /root/data
  nodeAffinity:
    required:
      # 通過(guò) hostname 限定在某個(gè)節(jié)點(diǎn)創(chuàng)建存儲(chǔ)卷
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - node2

Persistent Volume Claim (PVC)

對(duì)存儲(chǔ)需求的一個(gè)申明,可以理解為一個(gè)申請(qǐng)單,系統(tǒng)根據(jù)這個(gè)申請(qǐng)單去找一個(gè)合適的 PV
還可以根據(jù) PVC 自動(dòng)創(chuàng)建 PV。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodata
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: "local-storage"
  resources:
    requests:
      storage: 2Gi

3.3 本地測(cè)試

網(wǎng)絡(luò)云服務(wù)商封裝了底層,只需要提交pvc申請(qǐng)即可成功,這里我用本地進(jìn)行模擬,寫(xiě)到了一起,實(shí)際可以自行分開(kāi)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  serviceName: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          # IfNotPresent 僅本地沒(méi)有鏡像時(shí)才遠(yuǎn)程拉,Always 永遠(yuǎn)都是從遠(yuǎn)程拉,Never 永遠(yuǎn)只用本地鏡像,本地沒(méi)有則報(bào)錯(cuò)
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /data/db # 容器里面的掛載路徑
              name: mongo-data    # 卷名字,必須跟下面定義的名字一致
      volumes:
        - name: mongo-data              # 卷名字
          persistentVolumeClaim:
              claimName: mongodata

---
apiVersion: v1
kind: Service
metadata:
  name: mongodb
spec:
  clusterIP: None
  ports:
  - port: 27017
    protocol: TCP
    targetPort: 27017
  selector:
    app: mongodb
  type: ClusterIP
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodata
spec:
  capacity:
    storage: 2Gi
  volumeMode: Filesystem  # Filesystem(文件系統(tǒng)) Block(塊)
  accessModes:
    # 卷可以被一個(gè)節(jié)點(diǎn)以讀寫(xiě)方式掛載
    - ReadWriteOnce       
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /root/data
  nodeAffinity:
    required:
      # 通過(guò) hostname 限定在某個(gè)節(jié)點(diǎn)創(chuàng)建存儲(chǔ)卷
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - node2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodata
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: "local-storage"
  resources:
    requests:
      storage: 2Gi

測(cè)試

# 運(yùn)行
kubectl apply -f storage.yaml
# 查看各個(gè)層信息
kubectl get pv
kubectl get sc
kubectl get pvc
kubectl get pod -owide
# 需要進(jìn)入node2結(jié)點(diǎn)去創(chuàng)建一下data路徑,可能會(huì)報(bào)錯(cuò),后面mongo的數(shù)據(jù)庫(kù)就掛在到了node2的/data下面

七、ConfigMap & Secret

1、概述

參考文檔:https://kubernetes.io/zh/docs/concepts/configuration/configmap/

數(shù)據(jù)庫(kù)連接地址,這種可能根據(jù)部署環(huán)境變化的,我們不應(yīng)該寫(xiě)死在代碼里。Kubernetes 為我們提供了 ConfigMap,可以方便的配置一些變量

2、ConfigMap

創(chuàng)建configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mongo-config
data:
  mongoHost: mongodb-0.mongodb
# 應(yīng)用
kubectl apply -f configmap.yaml
# 查看
kubectl get configmap mongo-config -o yaml
kubectl get configmap

3、Secret

一些重要數(shù)據(jù),例如密碼、TOKEN,我們可以放到 secret 中。文檔,配置證書(shū)。注意,數(shù)據(jù)要進(jìn)行 Base64 編碼。Base64 工具

創(chuàng)建secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mongo-secret
# Opaque 用戶定義的任意數(shù)據(jù),更多類型介紹 https://kubernetes.io/zh/docs/concepts/configuration/secret/#secret-types
type: Opaque
data:
  # 數(shù)據(jù)要 base64。https://tools.fun/base64.html
  mongo-username: bW9uZ291c2Vy
  mongo-password: bW9uZ29wYXNz

# 應(yīng)用
kubectl apply -f secret.yaml
# 查看
kubectl get secret mongo-secret -o yaml
kubectl get secret

4、Demo使用

作為環(huán)境變量使用

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mongodb
  serviceName: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          # IfNotPresent 僅本地沒(méi)有鏡像時(shí)才遠(yuǎn)程拉,Always 永遠(yuǎn)都是從遠(yuǎn)程拉,Never 永遠(yuǎn)只用本地鏡像,本地沒(méi)有則報(bào)錯(cuò)
          imagePullPolicy: IfNotPresent
          env:
          - name: MONGO_INITDB_ROOT_USERNAME
            valueFrom:
              secretKeyRef:
                name: mongo-secret
                key: mongo-username
          - name: MONGO_INITDB_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mongo-secret
                key: mongo-password
          # Secret 的所有數(shù)據(jù)定義為容器的環(huán)境變量,Secret 中的鍵名稱為 Pod 中的環(huán)境變量名稱
          # envFrom:
          # - secretRef:
          #     name: mongo-secret
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb
spec:
  selector:
    app: mongodb
  type: ClusterIP
  # HeadLess
  clusterIP: None
  ports:
    - port: 27017
      targetPort: 27017

掛載為文件(更適合證書(shū)文件)掛載后,會(huì)在容器中對(duì)應(yīng)路徑生成文件,一個(gè) key 一個(gè)文件,內(nèi)容就是 value,文檔

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret

進(jìn)行測(cè)試(test-k8s的鏡像更換ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v4-configmap)

kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash
mongo --host mongodb-0.mongodb -u mongouser -p mongopass
show dbs
# 外部訪問(wèn)需要端口轉(zhuǎn)發(fā)

八、Helm & 命名空間

1、簡(jiǎn)介

Helm官網(wǎng):https://helm.sh/zh/
包搜索:https://artifacthub.io/

Helm類似 npm,pip,docker hub, 可以理解為是一個(gè)軟件庫(kù),可以方便快速的為我們的集群安裝一些第三方軟件。使用 Helm 我們可以非常方便的就搭建出來(lái) MongoDB / MySQL 副本集群,YAML 文件別人都給我們寫(xiě)好了,直接使用

2、Helm安裝

安裝文檔:https://helm.sh/zh/docs/intro/install/

# 腳本安裝,不過(guò)可能會(huì)失敗
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 手動(dòng)進(jìn)行安裝
wget https://get.helm.sh/helm-v3.10.1-linux-amd64.tar.gz
tar -zxvf helm-v3.10.1-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm
helm --help

3、安裝MongoDb

# 安裝
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-mongo bitnami/mongodb

# 指定密碼和架構(gòu)
helm install my-mongo bitnami/mongodb --set architecture="replicaset",auth.rootPassword="mongopass"

# 刪除
helm ls
helm delete my-mongo

# 查看密碼
kubectl get secret my-mongo-mongodb -o json
kubectl get secret my-mongo-mongodb -o yaml > secret.yaml

# 臨時(shí)運(yùn)行一個(gè)包含 mongo client 的 debian 系統(tǒng)
kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash

# 進(jìn)去 mongodb
mongo --host "my-mongo-mongodb" -u root -p mongopass

# 也可以轉(zhuǎn)發(fā)集群里的端口到宿主機(jī)訪問(wèn) mongodb
kubectl port-forward svc/my-mongo-mongodb 27017:27018

4、命名空間

如果一個(gè)集群中部署了多個(gè)應(yīng)用,所有應(yīng)用都在一起,就不太好管理,也可以導(dǎo)致名字沖突等。我們可以使用 namespace 把應(yīng)用劃分到不同的命名空間,跟代碼里的 namespace 是一個(gè)概念,只是為了劃分空間

# 創(chuàng)建命名空間
kubectl create namespace testapp
# 部署應(yīng)用到指定的命名空間
kubectl apply -f app.yml --namespace testapp
# 查詢
kubectl get pod --namespace kube-system
# 查詢命名空間
kubectl get ns

可以用 kubens 快速切換 namespace,首先進(jìn)行下載安裝

wget https://github.com/ahmetb/kubectx/releases/download/v0.9.4/kubens_v0.9.4_linux_x86_64.tar.gz
tar -zxvf kubens_v0.9.4_linux_x86_64.tar.gz
sudo mv kubens /usr/local/bin/kubens
# 查看所有命名空間
kubens
# 切換命名空間
kubens kube-system
# 回到上個(gè)命名空間
kubens -
# 切換集群
# kubectx minikube

九、Ingress

1、介紹

Ingress 為外部訪問(wèn)集群提供了一個(gè) 統(tǒng)一 入口,避免了對(duì)外暴露集群端口;功能類似 Nginx,可以根據(jù)域名、路徑把請(qǐng)求轉(zhuǎn)發(fā)到不同的 Service??梢耘渲?https

**跟 LoadBalancer 有什么區(qū)別?**LoadBalancer 需要對(duì)外暴露端口,不安全;無(wú)法根據(jù)域名、路徑轉(zhuǎn)發(fā)流量到不同 Service,多個(gè) Service 則需要開(kāi)多個(gè) LoadBalancer;功能單一,無(wú)法配置 https

k8s快速入門(mén)

2、使用

文檔:Ingress

要使用 Ingress,需要一個(gè)負(fù)載均衡器 + Ingress Controller如果是裸機(jī)(bare metal) 搭建的集群,你需要自己安裝一個(gè)負(fù)載均衡插件,可以安裝 METALLB如果是云服務(wù)商,會(huì)自動(dòng)給你配置,否則你的外部 IP 會(huì)是 "pending"狀態(tài),無(wú)法使用。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-example
spec:
  ingressClassName: nginx
  rules:
  - host: tools.fun
    http:
      paths:
      - path: /easydoc
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 4200
      - path: /svnbucket
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 8080


參考文檔:

https://www.bilibili.com/video/BV1Tg411P7EB

https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/9EX8Cp45

https://kuboard.cn/install/install-k8s.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-426372.html

到了這里,關(guān)于k8s快速入門(mén)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Kubernetes(k8s)概念介紹

    Kubernetes(k8s)概念介紹

    K8s是一個(gè)開(kāi)源的用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化的應(yīng)用,k8s的目標(biāo)是讓部署容器化的應(yīng)用簡(jiǎn)單并且高效,k8s提供了應(yīng)用部署,規(guī)劃,更新,維護(hù)的一種機(jī)制。k8s是google在2014年開(kāi)源的容器化集群部署管理系統(tǒng),使用k8s可以進(jìn)行容器化應(yīng)用部署,它有利于應(yīng)用擴(kuò)展,k8s目標(biāo)

    2024年02月15日
    瀏覽(91)
  • Kubernetes(簡(jiǎn)稱k8s)簡(jiǎn)介

    Kubernetes(簡(jiǎn)稱k8s)是一種開(kāi)源的容器編排平臺(tái),它可以自動(dòng)化地部署、擴(kuò)展和管理容器化應(yīng)用程序。Kubernetes最初由Google公司設(shè)計(jì)和開(kāi)發(fā),并于2014年正式發(fā)布。如今,它已成為容器編排領(lǐng)域的事實(shí)標(biāo)準(zhǔn),被廣泛應(yīng)用于各種場(chǎng)景中,包括Web應(yīng)用程序、大數(shù)據(jù)處理、人工智能等。

    2024年02月06日
    瀏覽(21)
  • Kubernetes(K8S)的基礎(chǔ)概念

    Kubernetes(K8S)的基礎(chǔ)概念

    用于自動(dòng)部署、擴(kuò)展和管理“容器化( containerized) 應(yīng)用程序”的開(kāi)源系統(tǒng) 可以理解成K8S是負(fù)責(zé)自動(dòng)化運(yùn)維管理多個(gè)容器化程序(比如Docker)的集群,是–個(gè)生態(tài)極其豐富的容器編排框架工具 由來(lái): k8S由google的Borg系統(tǒng)(博格系統(tǒng),google內(nèi)部使用的大規(guī)模容器編排工具)作為原型,后

    2024年02月05日
    瀏覽(95)
  • 【云原生 ? Kubernetes】認(rèn)識(shí) k8s、k8s 架構(gòu)、核心概念點(diǎn)介紹

    【云原生 ? Kubernetes】認(rèn)識(shí) k8s、k8s 架構(gòu)、核心概念點(diǎn)介紹

    目錄 一、Kubernetes 簡(jiǎn)介 二、Kubernetes 架構(gòu) 三、Kunbernetes 有哪些核心概念? 1. 集群 Cluster 2. 容器 Container 3. POD 4. 副本集 ReplicaSet 5. 服務(wù) service 6. 發(fā)布 Deployment 7. ConfigMap/Secret 8. DaemonSet 9. 核心概念總結(jié) Kubernetes 簡(jiǎn)稱 k8s,是支持云原生部署的一個(gè)平臺(tái),起源于谷歌。谷歌早在十幾

    2024年02月03日
    瀏覽(859)
  • Kubernetes(k8s)的概念以及使用

    Kubernetes(k8s)的概念以及使用

    K8s是指Kubernetes,是一個(gè)開(kāi)源的容器編排和管理平臺(tái)。它最初由Google開(kāi)發(fā),并于2014年將其開(kāi)源。Kubernetes旨在簡(jiǎn)化容器化應(yīng)用程序的部署、擴(kuò)展和管理。 Kubernetes提供了一種可靠且可擴(kuò)展的平臺(tái),用于管理容器化應(yīng)用程序的生命周期。它具有以下主要功能: 自動(dòng)化應(yīng)用程序部署

    2024年04月28日
    瀏覽(34)
  • Kubernetes(K8s)的核心組件簡(jiǎn)介

    Kubernetes(簡(jiǎn)稱 K8s)是一個(gè)開(kāi)源的,用于自動(dòng)化部署、擴(kuò)展和管理容器化應(yīng)用程序的平臺(tái)。在這篇文章中,我們將深入研究 Kubernetes 的核心組件及其功能。 一、Master 組件 1. API Server:Kubernetes 的主要管理組件。所有的管理任務(wù)都是通過(guò) API Server 進(jìn)行的。它是 Kubernetes 的前端,

    2024年02月15日
    瀏覽(22)
  • 【k8s】Kubernetes技術(shù)和相關(guān)命令簡(jiǎn)介

    【k8s】Kubernetes技術(shù)和相關(guān)命令簡(jiǎn)介

    Kubernetes是Google開(kāi)源的一個(gè)容器編排引擎,它支持自動(dòng)化部署、大規(guī)模可伸縮、應(yīng)用容器化管理。在生產(chǎn)環(huán)境中部署一個(gè)應(yīng)用程序時(shí),通常要部署該應(yīng)用的多個(gè)實(shí)例以便對(duì)應(yīng)用請(qǐng)求進(jìn)行負(fù)載均衡。kubernetes,簡(jiǎn)稱K8s,是用8代替8個(gè)字符“ubernete”而成的縮寫(xiě)。 在Kubernetes中,我們

    2024年01月18日
    瀏覽(24)
  • kubernetes(k8s) pod(資源限制、基礎(chǔ)概念)

    kubernetes(k8s) pod(資源限制、基礎(chǔ)概念)

    目錄 ?一、資源限制 1、概念 1.2、Pod和容器的資源請(qǐng)求和限制 1.3、CPU資源單位 1.4、內(nèi)存資源單位 1.5、CPU和內(nèi)存的Requests和Limits的特點(diǎn) 1.6、案例 二、pod 的兩種使用方式 三、pod 資源共享 四、底層容器Pause 1、pause 共享資源 1.1、網(wǎng)絡(luò) 1.2、存儲(chǔ) 1.3、小結(jié) 2、Pause主要功能 3、Pod

    2024年02月05日
    瀏覽(103)
  • 用Kubernetes(k8s)的ingress部署https應(yīng)用

    用Kubernetes(k8s)的ingress部署https應(yīng)用

    我之前有一片文章寫(xiě)的是用ingress暴露應(yīng)用,這篇文章接著上一片文章繼續(xù)講使用ingress暴露https的應(yīng)用。請(qǐng)先參考上一片文章將ingress先在Kubernetes集群當(dāng)中安裝上: ingress暴露應(yīng)用文章地址:https://blog.csdn.net/m0_51510236/article/details/132536519 因?yàn)槭潜┞秇ttps,所以需要域名證書(shū)。分以

    2024年02月10日
    瀏覽(52)
  • [Kubernetes]9. K8s ingress講解借助ingress配置http,https訪問(wèn)k8s集群應(yīng)用

    [Kubernetes]9. K8s ingress講解借助ingress配置http,https訪問(wèn)k8s集群應(yīng)用

    前面講解了使用Helm部署mysql集群,這里來(lái)看看使用Ingress搭建負(fù)載均衡功能 功能類似 Nginx ,可以根據(jù)域名、路徑把請(qǐng)求轉(zhuǎn)發(fā)到不同的 Service , Ingress 為外部訪問(wèn)集群提供了一個(gè) 統(tǒng)一 入口, 避免 了 對(duì)外暴露集群端口 ,可以配置 https,http訪問(wèn)集群應(yīng)用,接下來(lái)看看如何通過(guò)騰訊云來(lái)

    2024年01月22日
    瀏覽(35)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包