日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

發(fā)布時(shí)間:2023/12/4 asp.net 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


在上一個(gè)小系列文章《ASP.NET Core on K8S學(xué)習(xí)初探》中,通過(guò)在Windows上通過(guò)Docker for Windows搭建了一個(gè)單節(jié)點(diǎn)的K8S環(huán)境,并初步嘗試將ASP.NET Core WebAPI項(xiàng)目部署到了K8S,把玩了一下快速部署和實(shí)例伸縮。這個(gè)系列開(kāi)始,會(huì)繼續(xù)學(xué)習(xí)K8S以及在Linux上搭建集群來(lái)深入把玩。本篇會(huì)回顧一下K8S的基本概念以及架構(gòu)組成,然后會(huì)通過(guò)Kubeadm快速地搭建一個(gè)K8S集群供后續(xù)學(xué)習(xí)把玩之用。


01

K8S基礎(chǔ)概念回顧


 1.Cluster 集群

  計(jì)算、存儲(chǔ)和網(wǎng)絡(luò)資源的集合,Kubernetes利用這些資源運(yùn)行各種基于容器的應(yīng)用。

  2.Master

  Master是Cluster的大腦,負(fù)責(zé)調(diào)度(決定將應(yīng)用放在哪里運(yùn)行),一般為了實(shí)現(xiàn)高可用,會(huì)有多個(gè)Master。

  3.Node

  負(fù)責(zé)運(yùn)行具體的容器,Node由Master管理,它會(huì)監(jiān)控并匯報(bào)容器的狀態(tài),同時(shí)根據(jù)Master的要求管理容器的生命周期。

  eg. 在交互實(shí)驗(yàn)中,這個(gè)Cluster中只有一個(gè)主機(jī),它既是Master也是Node。

  4.Pod

  Kubernetes的最小工作單元,每個(gè)Pod包含一個(gè)或多個(gè)容器。Pod中的容器會(huì)被作為一個(gè)整體被Master調(diào)度到一個(gè)Node上運(yùn)行。

  (1)為何引入Pod?

  一是方便管理:

  有些容器天生聯(lián)系緊密,需要在一起工作。Pod提供了比容器更高層次的抽象,將它們封裝到一個(gè)部署單元中。K8S以Pod為最小單位進(jìn)行調(diào)度、擴(kuò)展、共享資源、管理生命周期。

  eg.正例:File Puller & Web Server => 需要部署在一起工作

    反例:Tomecat & MySQL => 不需要部署在一起工作

  二是可以共享資源和通信:

  Pod中所有容器使用同一個(gè)網(wǎng)絡(luò)namespace,即相同的IP和端口空間,可以直接用localhost通信,而且還可以共享存儲(chǔ)(本質(zhì)是通過(guò)將Volume掛載到Pod中的每個(gè)容器)

  (2)如何使用Pod?

  運(yùn)行單個(gè)容器:one-container-per-Pod,K8S中最常見(jiàn)的模型,即使這種情形下,K8S管理的也是Pod而不是單個(gè)容器。

  運(yùn)行多個(gè)容器:將聯(lián)系非常緊密的多個(gè)容器部署到一個(gè)Pod中,可以直接共享資源。

  5.Controller

  K8S不會(huì)直接創(chuàng)建Pod,是通過(guò)Controller來(lái)管理Pod的。為了滿足不同業(yè)務(wù)場(chǎng)景,K8S提供了多種Controller:

  (1)Deployment

  最常見(jiàn)的Controller,可以管理Pod的多個(gè)副本,并確保Pod按照期望的狀態(tài)運(yùn)行。

  (2)ReplicaSet

  實(shí)現(xiàn)了Pod的多副本管理,使用Deployment時(shí)會(huì)自動(dòng)創(chuàng)建ReplicaSet。換句話說(shuō),Deployment是通過(guò)ReplicaSet來(lái)管理Pod的多個(gè)副本的,通常不需要直接使用ReplicaSet。

  (3)DaemonSet

  用于每個(gè)Node最多只運(yùn)行一個(gè)Pod副本的場(chǎng)景,DaemonSet通常用于運(yùn)行daemon(守護(hù)進(jìn)程、后臺(tái)程序)。

  (4)StatefuleSet

  用于保證Pod的每個(gè)副本在整個(gè)生命周期中名稱(chēng)是不變的,而其他的Controller不提供這個(gè)功能。(非StatefuleSet下,當(dāng)某個(gè)Pod發(fā)生故障需要?jiǎng)h除并重啟時(shí),Pod的名稱(chēng)是會(huì)變化的)

  (5)Job

  用于運(yùn)行結(jié)束就刪除的應(yīng)用,其他Controller下Pod通常是長(zhǎng)期持續(xù)運(yùn)行的。

  6.Service

  K8S定義了外界訪問(wèn)一個(gè)或一組特定Pod的方式,就是Service。每個(gè)Service有自己的IP和端口,并且為Pod提供了負(fù)載均衡。

  如果說(shuō)K8S運(yùn)行Pod的任務(wù)是交給了Controller去做,那么訪問(wèn)Pod的任務(wù)則是交給了Service去做。

  7.Namespace

  Namespace將一個(gè)物理的Cluster從邏輯上劃分為多個(gè)虛擬Cluster,每個(gè)虛擬Cluster就是一個(gè)Namespace,不同Namespace中的資源是完全隔離的。

K8S中會(huì)自動(dòng)創(chuàng)建兩個(gè)Namespace:

  (1)default:創(chuàng)建資源時(shí)如果不指定Namespace就會(huì)放到這里

  (2)kube-system: K8S自己創(chuàng)建的系統(tǒng)資源都會(huì)放到這個(gè)Namespace中


02

K8S集群架構(gòu)解析


下面展示了一個(gè)最小化的K8S集群,一個(gè)master節(jié)點(diǎn)和兩個(gè)node節(jié)點(diǎn):

*.master上也有kubelet和kube-proxy是因?yàn)閙aster同時(shí)也是一個(gè)Node

  1.Master節(jié)點(diǎn)

  K8S集群的“大腦”,運(yùn)行以下多個(gè)Daemon服務(wù):

  2.Node節(jié)點(diǎn)

  運(yùn)行Pod的主戰(zhàn)場(chǎng),主要運(yùn)行以下K8S組件:


03

K8S集群環(huán)境搭建


3.1 K8S環(huán)境搭建的幾種方式

  搭建K8S環(huán)境有幾種常見(jiàn)的方式如下:

  (1)Minikube

  Minikube是一個(gè)工具,可以在本地快速運(yùn)行一個(gè)單點(diǎn)的K8S,供初步嘗試K8S或日常開(kāi)發(fā)的用戶使用,不能用于生產(chǎn)環(huán)境。

  (2)Kubeadm

  Kubeadm是K8S官方社區(qū)推出的一套用于簡(jiǎn)化快速部署K8S集群的工具,Kubeadm的設(shè)計(jì)目的是為新用戶開(kāi)始嘗試K8S提供一種簡(jiǎn)單的方法。

  (3)二進(jìn)制包

  除了以上兩種方式外,我們還可以通過(guò)從官方下載二進(jìn)制包,手動(dòng)部署每個(gè)組件組成K8S集群,這也是目前企業(yè)生產(chǎn)環(huán)境中廣為使用的方式,但對(duì)K8S管理人員的要求較高。

  本次學(xué)習(xí)實(shí)踐我們主要借助Kubeadm工具搭建K8S集群,以便后續(xù)實(shí)踐部署ASP.NET Core應(yīng)用集群。

3.2 搭建前的準(zhǔn)備工作

  (1)準(zhǔn)備三臺(tái)Linux服務(wù)器

  這里我選擇通過(guò)VMware Workstaion來(lái)搭建3個(gè)虛擬機(jī),每個(gè)配置2CPU和2G內(nèi)存,如下圖:

  

  (2)配置主機(jī)名與靜態(tài)IP地址如下表所示:

角色主機(jī)名IP地址
Masterk8s-master192.168.2.100
Nodek8s-node1192.168.2.101
Nodek8s-node2192.168.2.102

  然后,更改hosts文件添加主機(jī)名與IP映射關(guān)系

# vim /etc/hosts 192.168.2.100 k8s-master 192.168.2.101 k8s-node1 192.168.2.102 k8s-node2

  (3)關(guān)閉防火墻

systemctl stop firewalld systemctl disable firewalld

  (4)關(guān)閉selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0

  (5)關(guān)閉swap => K8S中不支持swap分區(qū)

# vim /etc/fstab #/dev/mapper/centos-swap swap swap defaults 0 0

  *.編輯etc/fstab將swap那一行注釋掉或者刪除掉

  (6)將橋接的IPv4流量傳遞到iptables的鏈

# cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # sysctl --system

3.3 安裝Docker&Kubeadm&Kubelet

????以下步驟請(qǐng)?jiān)谒泄?jié)點(diǎn)中操作:

  (1)安裝Docker

# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo # yum -y install docker-ce-18.06.1.ce-3.el7 # systemctl enable docker && systemctl start docker # docker --version Docker version 18.06.1-ce, build e68fc7a

  *.這里安裝的是18.06社區(qū)版,如果你之前有安裝低版本的Docker,為了配合本次實(shí)驗(yàn)的K8S版本(1.13.x),建議先卸載掉,卸載過(guò)程可以參考這篇文章《CentOS7 Docker升級(jí)》。

  (2)添加阿里云Yum軟件源

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

  (3)安裝Kubeadm&Kubelet&Kubectl

  注意:本次部署K8S版本號(hào)為1.13.3

# yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 # systemctl enable kubelet

  遇到的一些坑如下:

  ① 碰到需要kubernetes-cni的問(wèn)題:

#####錯(cuò)誤:軟件包:kubelet-1.13.3-0.x86_64 (kubernetes) 需要:kubernetes-cni = 0.6.0 可用: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes) kubernetes-cni = 0.3.0.1-0.07a8a2 可用: kubernetes-cni-0.5.1-0.x86_64 (kubernetes) kubernetes-cni = 0.5.1-0 可用: kubernetes-cni-0.5.1-1.x86_64 (kubernetes) kubernetes-cni = 0.5.1-1 可用: kubernetes-cni-0.6.0-0.x86_64 (kubernetes) kubernetes-cni = 0.6.0-0 正在安裝: kubernetes-cni-0.7.5-0.x86_64 (kubernetes) kubernetes-cni = 0.7.5-0 您可以嘗試添加 --skip-broken 選項(xiàng)來(lái)解決該問(wèn)題 您可以嘗試執(zhí)行:rpm -Va --nofiles --nodigest

  解決:手動(dòng)安裝kubernetes-cni對(duì)應(yīng)的版本

yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0

  ②?使用yum安裝程序時(shí),提示xxx.rpm公鑰尚未安裝

從 https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 檢索密鑰 導(dǎo)入 GPG key 0xA7317B0F: 用戶ID : "Google Cloud Packages Automatic Signing Key <gc-team@google.com>" 指紋 : d0bc 747f d8ca f711 7500 d6fa 3746 c208 a731 7b0f 來(lái)自 : https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg e3438a5f740b3a907758799c3be2512a4b5c64dbe30352b2428788775c6b359e-kubectl-1.13.3-0.x86_64.rpm 的公鑰尚未安裝 失敗的軟件包是:kubectl-1.13.3-0.x86_64 GPG 密鑰配置為:https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

  解決:使用 yum install xxx.rpm --nogpgcheck 命令格式跳過(guò)公鑰檢查,比如跳過(guò)kubectl和kubeadm的公鑰檢查如下命令:

yum install kubectl-1.13.3-0.x86_64 --nogpgcheck yum install kubeadm-1.13.3-0.x86_64 --nogpgcheck

3.4 部署Kubernetes Master

  以下步驟請(qǐng)?jiān)趉8s-master節(jié)點(diǎn)上操作:

kubeadm init \ --apiserver-advertise-address=192.168.2.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.13.3 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16

PS:由于默認(rèn)拉取鏡像地址k8s.gcr.io國(guó)內(nèi)無(wú)法訪問(wèn),這里指定阿里云鏡像倉(cāng)庫(kù)地址(registry.aliyuncs.com/google_containers)。官方建議服務(wù)器至少2CPU+2G內(nèi)存,當(dāng)然內(nèi)存1G也是可以的,但是會(huì)出Warning,建議還是老老實(shí)實(shí)升2G內(nèi)存把。

  

  接下來(lái),為了順利使用kubectl命令,執(zhí)行以下命令:

mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # kubectl get nodes

  這時(shí)你可以使用kubectl了,當(dāng)你執(zhí)行完kubectl get nodes之后,你會(huì)看到如下?tīng)顟B(tài):

  

3.5 部署Pod網(wǎng)絡(luò)插件(CNI)

  同樣,繼續(xù)在k8s-master上操作:

kubectl apply -f \ https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

  然后通過(guò)以下命令驗(yàn)證:全部為Running則OK,其中一個(gè)不為Running,比如:Pending、ImagePullBackOff都表明Pod沒(méi)有就緒

  

  如果其中有的Pod沒(méi)有Running,可以通過(guò)以下命令查看具體錯(cuò)誤原因,比如這里我想查看kube-flannel-ds-amd64-8bmbm這個(gè)pod的錯(cuò)誤信息:

kubectl describe pod kube-flannel-ds-amd64-8bmbm -n kube-system

  在此過(guò)程中可能會(huì)遇到無(wú)法從qury.io拉取flannel鏡像從而導(dǎo)致無(wú)法正常Running,解決辦法如下:

  使用國(guó)內(nèi)云服務(wù)商提供的鏡像源然后通過(guò)修改tag的方式曲線救國(guó)

docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 docker tag quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64 docker rmi quay-mirror.qiniu.com/coreos/flannell:v0.11.0-amd64

  這時(shí),我們?cè)倏纯磎aster節(jié)點(diǎn)的狀態(tài)就會(huì)從NotReady變?yōu)镽eady:

  

  那么,恭喜你,Master節(jié)點(diǎn)部署結(jié)束了。如果你只想要一個(gè)單節(jié)點(diǎn)的K8S,那么這里就完成了部署了。

3.6 加入Kubernetes Node

  在兩臺(tái)Node節(jié)點(diǎn)上執(zhí)行join命令:

kubeadm join 192.168.2.100:6443 --token ekqxk2.iiu5wx5bbnbdtxsw --discovery-token-ca-cert-hash \ sha256:c50bb83d04f64f4a714b745f04682b27768c1298f331e697419451f3550f2d05

  這里需要注意的就是,帶上在Master節(jié)點(diǎn)Init成功后輸出的Token。如果找不到了,沒(méi)關(guān)系,可以通過(guò)以下命令來(lái)查看:

kubeadm token list

  Node節(jié)點(diǎn)上成功join之后會(huì)得到以下信息:

  

  這時(shí),我們?cè)趍aster節(jié)點(diǎn)上執(zhí)行以下命令可以看到集群各個(gè)節(jié)點(diǎn)的狀態(tài)了:

  

  如果看到兩個(gè)Node狀態(tài)不是Ready,那么可能需要檢查哪些Pod沒(méi)有正常運(yùn)行:

kubectl get pod --all-namespaces

  然后按照3.5中的檢查方式進(jìn)行檢查并修復(fù),最終kubectl get nodes效果應(yīng)該狀態(tài)都是Running。注意的是在檢查時(shí)需要注意是哪個(gè)Node上的錯(cuò)誤,然后在對(duì)應(yīng)的Node進(jìn)行修復(fù),比如拉取flannel鏡像。

  至此,一個(gè)最小化的K8S集群已經(jīng)搭建完畢。

3.7 測(cè)試Kubernetes集群

  這里為了快速地驗(yàn)證一下我們的K8S集群是否可用,創(chuàng)建一個(gè)示例Pod:

kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get pod,svc

  

????如果想要看到更多的信息,比如pod被部署在了哪個(gè)Node上,可以通過(guò) kubectl get pods,svc -o wide來(lái)查看。

  

?  因?yàn)槭荖odePort方式,因此其映射暴露出來(lái)的端口號(hào)會(huì)在30000-32767范圍內(nèi)隨機(jī)取一個(gè),我們可以直接通過(guò)瀏覽器輸入IP地址訪問(wèn),比如這時(shí)我們通過(guò)瀏覽器來(lái)訪問(wèn)一下任一Node的IP地址加端口號(hào),例如192.168.2.101:31174或192.168.2.102:31174

  

  

  ?如果能夠成功看到,那么恭喜你,你的K8S集群能夠成功運(yùn)行了,萬(wàn)里長(zhǎng)征走完了第一步!


04

小結(jié)


本文快速地介紹了一下Kubernetes的核心構(gòu)成組件及其作用,然后通過(guò)在三臺(tái)Linux主機(jī)上通過(guò)Kubeadm搭建了一個(gè)Master節(jié)點(diǎn)兩個(gè)Node節(jié)點(diǎn)的集群,最后通過(guò)部署一個(gè)Deployment來(lái)快速地驗(yàn)證了一下集群是否可用。下一篇會(huì)通過(guò)一個(gè)ASP.NET Core的部署例子來(lái)演示和介紹一下各個(gè)組件之間是如何協(xié)作的,以及部署Dashboard。


參考資料

(1)CloudMan,《每天5分鐘玩轉(zhuǎn)Kubernetes》

(2)李振良,《一天入門(mén)Kubernets教程》

(3)李振良,《30分鐘部署一個(gè)Kubernetes集群》

(4)cao_xiaobo,《CentOS7 部署K8S集群》





點(diǎn)個(gè)在看少個(gè)bug??

總結(jié)

以上是生活随笔為你收集整理的ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。