CentOS單機(jī)安裝k8s并部署.NET 6程序
學(xué)習(xí)云原生,k8s 是一個基礎(chǔ),為了做一些實驗,單機(jī)部署是最方便的,下面將介紹在 CentOS 中單機(jī)安裝 k8s ,并將一個 .NET 6 的程序發(fā)布到 k8s 中。
環(huán)境
宿主機(jī):Mac 10.15.7 CentOS 版本:7.6 內(nèi)存:4gb cpu:2核 docker:20.10.12 k8s:1.23.4
準(zhǔn)備
1、創(chuàng)建一個 CentOS 虛擬機(jī),配置如下:
版本:7.6 cpu:2核 內(nèi)存:4gb
2、執(zhí)行下面命令更新 yum 源:
yum?update
3、設(shè)置 iptables 檢查橋接流量,編輯 ?/etc/sysctl.conf 文件,在文件中添加如下內(nèi)容:
net.bridge.bridge-nf-call-iptables?=?1
4、禁用 swap:
swapoff?-a
修改 /etc/fstab 文件,將下圖紅框部分注釋:

安裝
1、安裝 docker:
sudo?yum?install?-y?yum-utils?device-mapper-persistent-data?lvm2
sudo?yum-config-manager?--add-repo?https://download.docker.com/linux/centos/docker-ce.repo
sudo?yum-config-manager?--add-repo?http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo?yum-config-manager?--enable?docker-ce-edge
sudo?yum?install?docker-ce
systemctl?start?docker
chkconfig?docker?on
2、在 /etc/yum.repos.d 下創(chuàng)建 k8s.repo, 并添加如下內(nèi)容:
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
???????http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
3、安裝 kubelet、kubeadm 和 kubectl:
yum?install?-y?kubelet?kubeadm?kubectl
systemctl?enable?kubelet??&&?systemctl?start?kubelet
4、在 root 目錄下創(chuàng)建文件 k8s-images.sh ,內(nèi)容如下:
for?i?in?`kubeadm?config?images?list`;?do?
??imageName=${i#k8s.gcr.io/}
??docker?pull?registry.aliyuncs.com/google_containers/$imageName
??docker?tag?registry.aliyuncs.com/google_containers/$imageName?k8s.gcr.io/$imageName
??docker?rmi?registry.aliyuncs.com/google_containers/$imageName
done;
5、執(zhí)行 sh k8s-images.sh 命令來進(jìn)行相關(guān)鏡像的拉取,但最后會報一個錯,coredns 鏡像拉取失敗,如果是科學(xué)上網(wǎng)就不存在問題,錯誤信息如下:
Error response from daemon: pull access denied for registry.aliyuncs.com/google_containers/k8s.gcr.io/coredns/coredns, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
可以手動拉取鏡像來進(jìn)行處理,依次執(zhí)行下面命令:
docker?pull?coredns/coredns
docker?tag?coredns/coredns:latest?k8s.gcr.io/coredns/coredns:v1.8.6
docker?rmi?coredns/coredns:latest
為什么上面 tag 的時候用的是 1.8.6 的版本,可以先執(zhí)行 kubeadm config images list查看下鏡像的版本,我這里執(zhí)行后的鏡像列表如下,而 coredns 就是 1.8.6:
k8s.gcr.io/kube-apiserver:v1.23.4 k8s.gcr.io/kube-controller-manager:v1.23.4 k8s.gcr.io/kube-scheduler:v1.23.4 k8s.gcr.io/kube-proxy:v1.23.4 k8s.gcr.io/pause:3.6 k8s.gcr.io/etcd:3.5.1-0 k8s.gcr.io/coredns/coredns:v1.8.6
6、設(shè)置 cgroup ,在 /etc/docker/ 目錄下添加 daemon.json 文件,內(nèi)容如下:
{
????"exec-opts":?["native.cgroupdriver=systemd"]
}
執(zhí)行下面命令讓配置生效:
systemctl?daemon-reload
systemctl?restart?docker
7、執(zhí)行下面命令開放端口,如果還是碰到各種端口不能訪問的問題,測試環(huán)境可以關(guān)閉防火墻:
#?6443?Kubernetes?API服務(wù)器?所有組件
firewall-cmd?--zone=public?--add-port=6443/tcp?--permanent?&&?firewall-cmd?--reload
#?10250?Kubelet?APT?Kubelet自身,控制平面組件
firewall-cmd?--zone=public?--add-port=10250/tcp?--permanent?&&?firewall-cmd?--reload
8、執(zhí)行下面命令初始化 k8s :
kubeadm?init
初始化成功,會出現(xiàn)下圖的日志:

如果中途有報錯,進(jìn)行了其他的設(shè)置后,需要執(zhí)行 kubeadm reset 后再執(zhí)行 kubeadm init 。
安裝后的配置
1、根據(jù)上圖的提示進(jìn)行配置,依次執(zhí)行下面命令:
mkdir?-p?$HOME/.kube
sudo?cp?-i?/etc/kubernetes/admin.conf?$HOME/.kube/config
sudo?chown?$(id?-u):$(id?-g)?$HOME/.kube/config
3、因為是單機(jī)版,需要讓 master 節(jié)點(diǎn)參與工作:
kubectl?taint?nodes?--all?node-role.kubernetes.io/master-
3、 安裝網(wǎng)絡(luò)插件:
kubectl?apply?-f?"https://cloud.weave.works/k8s/net?k8s-version=$(kubectl?version?|?base64?|?tr?-d?'\n')"
4、執(zhí)行 kubectl get nodes ,如果 status 為 Ready ,說明安裝配置完成,master 節(jié)點(diǎn)注冊到了 k8s 中。
NAME ? ? ? ? ? ? ?STATUS ? ROLES ? ? ? ? ? ? ? ? ?AGE ? ? VERSION k8s-single-temp ? Ready ? ?control-plane,master ? 5m58s ? v1.23.4
部署 .NET 6 程序
1、在命令行執(zhí)行命令創(chuàng)建一個名為k8s-netcore-demo的項目:
dotnet?new?webApp?-o?k8s-netcore-demo?--no-https
2、進(jìn)入 k8s-netcore-demo 目錄執(zhí)行 dotnet publish ,將發(fā)布后的 publish 目錄復(fù)制到上面的 CentOS 的 root 目錄中。
3、進(jìn)入 publish 目錄,創(chuàng)建 Dockerfile 文件,內(nèi)容如下:
FROM?mcr.microsoft.com/dotnet/aspnet:6.0
COPY?.?/app
WORKDIR?/app
EXPOSE?80/tcp
ENTRYPOINT?["dotnet",?"k8s-netcore-demo.dll"]
4、在 publish 目錄下執(zhí)行下面命令,將程序構(gòu)建成鏡像:
docker?build?-t?k8s-netcore-demo?.
5、搭建私有倉庫:
docker?pull?registry
docker?run?-d?-p?8888:5000?--restart=always?registry
6、編輯 /etc/docker/daemon.json 文件,添加下面內(nèi)容:
{
???"exec-opts":?["native.cgroupdriver=systemd"],
???"insecure-registries":["10.211.55.10:8888"]?#?新加的內(nèi)容,IP?為宿主機(jī)的?IP
}
執(zhí)行下面命令重啟生效:
sudo?systemctl?daemon-reload
sudo?systemctl?restart?docker
7、將構(gòu)建的鏡像推送到私有倉庫:
docker?tag?k8s-netcore-demo?10.211.55.10:8888/k8s-netcore-demo
docker?push?10.211.55.10:8888/k8s-netcore-demo
8、在 root 目錄下創(chuàng)建文件 deploy.yaml 文件,內(nèi)容如下:
apiVersion:?apps/v1
kind:?Deployment
metadata:
??name:?k8s-netcore-demo
??namespace:?k8s-netcore
??labels:
????k8s-app:?k8s-netcore-demo
spec:
??replicas:?2
??selector:
????matchLabels:
??????k8s-app:?k8s-netcore-demo
??template:
????metadata:
??????labels:
????????k8s-app:?k8s-netcore-demo
????spec:
??????containers:
??????-?name:?k8s-netcore-demo
????????image:?10.211.55.10:8888/k8s-netcore-demo
????????ports:
????????-?containerPort:?80
---
#?-------------------?Service?-------------------?#
kind:?Service
apiVersion:?v1
metadata:
??labels:
????k8s-app:?k8s-netcore-demo
??name:?k8s-netcore-demo
??namespace:?k8s-netcore
spec:
??type:?NodePort
??ports:
????-?port:?80
??????targetPort:?80
??selector:
????k8s-app:?k8s-netcore-demo
所有配置為 k8s-netcore-demo 的地方是構(gòu)建的鏡像的名稱; image 的值為 10.211.55.10:8888/k8s-netcore-demo,這個是鏡像發(fā)布到私有倉庫中的地址; namespace 的值配置為創(chuàng)建的 namespace 的名稱。
9、在 k8s 中創(chuàng)建 namespace :
kubectl?create?namespace?k8s-netcore
10、執(zhí)行 deploy.yaml 文件:
kubectl?create?-f?deploy.yaml?--validate
#加上?--validate?參數(shù),當(dāng)yaml文件有錯誤時,會給出提示
11、使用 kubectl get 命令查看創(chuàng)建情況:
kubectl?get?deploy?-n?k8s-netcore
#?結(jié)果如下:
NAME???????????????READY???UP-TO-DATE???AVAILABLE???AGE
k8s-netcore-demo???2/2?????2????????????2???????????8h
12、查看訪問端口:
kubectl?get?svc?-n?k8s-netcore
#?結(jié)果如下:
NAME???????????????TYPE???????CLUSTER-IP??????EXTERNAL-IP???PORT(S)????????AGE
k8s-netcore-demo???NodePort???10.106.23.177???????????80:32230/TCP???8h
13、訪問 http://10.211.55.10:32230 ,正常出現(xiàn)下圖則部署成功:

總結(jié)
我按照上面的步驟可以順利安裝成功,但由于系統(tǒng)、環(huán)境、網(wǎng)絡(luò)、版本的差異可能會出現(xiàn)問題,也不用擔(dān)心,根據(jù)錯誤信息搜索就能夠解決。
有問題不可怕,不斷地去解決問題,我們的能力才能提升。
