100 元實踐 k8s 搭建過程

前言

工作中越來越重度使用 k8s,想進一步瞭解 k8s 的工作原理。一方面學習業界優秀系統設計思路,另一方面多瞭解也可以提高日常工作效率,比如和 k8s 開發的溝通效率等。今天第一步:自己着手搭建一個 k8s 服務。

本文采用的版本:

kubectl kubelet kubeadm版本: 1.23.1
操作系統版本: CentOS 8.2 64位

準備工作

1. 採購雲主機

官方建議最低雲主機配置 2 核 4G,國內任意雲廠商採購就行,作爲 K8S 服務的宿主機。本教程操作系統爲 CentOS 8.2 64 位。

備註:官方文檔標記最低配置內存要求2G,但是安裝完dashboard、ingress等服務之後比較卡頓,所以爲了流暢這裏推薦4G內存。

2. 放開端口

外網放開30000端口,後續瀏覽器登陸 k8s dashboard 看板使用。並檢查 ssh 服務端口 22 是否正常開啓。

使用 ssh 登陸雲主機,開始配置。

3. 安裝工具

安裝常用工具:

yum install -y yum-utils device-mapper-persistent-data lvm2 iproute-tc

4. 添加阿里源

國內存在牆的問題,添加阿里源加速:

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

開始安裝

1. 安裝社區版本 docker

安裝:

yum -y install docker-ce

enable:

systemctl enable docker

查看 docker 版本docker version

2. 安裝 kubectl kubelet kubeadm

2.1 添加阿里源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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

注意點:v1.24 版本後 kubernetes 放棄 docker,安裝過程存在一些問題,這裏我們指定 1.23.1 版本安裝

2.2 安裝 1.23.1 版本 kubectl kubelet kubeadm:

yum install -y kubectl-1.23.1 kubelet-1.23.1 kubeadm-1.23.1

啓動 kubelet:

systemctl enable kubelet

查看 kubectl 版本:

2.3 修改cgroupdriver

執行如下命令:

cat <<EOF > /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

重啓服務:

systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet

2.4 替換鏡像源

由於這裏我們使用的是國內的雲廠商,訪問海外k8s.gcr.io拉取鏡像存在牆的問題,所以下面我們就替換成registry.cn-hangzhou.aliyuncs.com/google_containers的地址,具體操作如下:

刪除舊配置文件:

rm -f /etc/containerd/config.toml

生產默認配置文件:

containerd config default > /etc/containerd/config.toml

替換鏡像地址:

sed -i 's/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/google_containers/' /etc/containerd/config.toml

重啓containerd

systemctl restart containerd

2.4 初始化 k8s master 節點

初始化命令:

kubeadm init --kubernetes-version=1.23.1 \
--apiserver-advertise-address=<你的雲主機內網IP>   \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16

通常會卡在這一步,如果大家按照本文的版本,理論不會報錯,如果報錯需要逐個搜索解決了。

如果初始化失敗,執行如下命令後再重新初始化:

kubeadm reset -f

初始化成功之後得到如下命令,加入新的 node 節點使用 (本次不使用):

kubeadm join <你的雲主機內網IP>:6443 --token 78376v.rznvls130w3sgwb7 \
--discovery-token-ca-cert-hash sha256:add03fb7de52ad73fd96626fa9d9f0d639186524ba34d24742c15fce8093b8c5

配置kubectl

mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config

查看 k8s 服務啓動狀態:

kubectl get pod --all-namespaces

3. 安裝 calico 網絡

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

安裝完畢後,查看 calico 服務啓動狀態:

kubectl get pod --all-namespaces

4. 安裝 kubernates-dashboard

4.1 下載配置文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml

4.2 添加 nodeport

配置 nodeport,外網訪問 dashboard:

4.3 創建 dashboard 服務

創建:

kubectl apply -f recommended.yaml

查看 kubernetes-dashboard 啓動狀態:

kubectl get pod -n kubernetes-dashboard

4.4 外網訪問 dashboard

瀏覽器打開 dashboard,地址:你的外網 IP:30000

如上圖所示,因爲 https 的問題,瀏覽器會提示「您的連接不是私密連接」。推薦使用 chrome 瀏覽器,並在當前頁面上任意位置點擊,然後鍵盤輸入「thisisunsafe」再點擊回車健即可。

4.5 獲取 token

創建用戶。dashboard-adminuser.yaml配置文件示例,執行如下命令直接創建,參考官方教程創建示例用戶 https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

創建配置文件:

cat <<EOF > dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF

創建用戶:

kubectl apply -f dashboard-adminuser.yaml

創建成功之後提示:

serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

執行如下命令獲取 token:

kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

4.6 複製 token 登陸 dashboard

到這裏我們已經可以正常創建 pod 了,但是外網還不能直接訪問到 pod,雖然可以採用 dashboard 的nodeport的方案,但是nodeport只支持暴露 30000-32767 的端口,不適用於生產環境,接着我們就通過另一種方式ingress來對外暴露 pod。

5. 安裝 ingress

ingress-nginx 詳細官方教程:https://kubernetes.github.io/ingress-nginx/deploy/#quick-start

5.1 下載官方配置文件,這裏使用的 v1.3.1 版本:

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml

5.2 同樣由於牆的問題,我們把配置文件中的鏡像源換成阿里源:

替換nginx-ingress-controller鏡像源:

sed -i 's/registry.k8s.io\/ingress-nginx\/controller:v1.3.1@sha256:54f7fe2c6c5a9db9a0ebf1131797109bb7a4d91f56b9b362bde2abd237dd1974/registry.cn-hangzhou.aliyuncs.com\/google_containers\/nginx-ingress-controller:v1.3.1/g' ./deploy.yaml

替換kube-webhook-certgen鏡像源:

sed -i 's/registry.k8s.io\/ingress-nginx\/kube-webhook-certgen:v1.3.0@sha256:549e71a6ca248c5abd51cdb73dbc3083df62cf92ed5e6147c780e30f7e007a47/registry.cn-hangzhou.aliyuncs.com\/google_containers\/kube-webhook-certgen:v1.3.0/g' ./deploy.yaml

5.3 創建 ingress 服務

創建:

kubectl apply -f deploy.yaml

查看狀態:

kubectl get pod --all-namespaces

創建完成之後,查看 ingress 狀態,爲pending狀態,原因是缺少 LB,這裏我們使用metallb

5.4 安裝 metallb

執行安裝命令:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml

創建 secret:

kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

查看安裝狀態:

kubectl get ns
kubectl get all -n metallb-system

5.4 綁定外網 IP EXTERNAL-IP

kubectl get service ingress-nginx-controller --namespace=ingress-nginx

kubectl edit service ingress-nginx-controller --namespace=ingress-nginx

添加:
externalIPs:
- 118.195.228.232

kubectl get service ingress-nginx-controller --namespace=ingress-nginx

查看啓動狀態kubectl get pod --all-namespaces

metalab 和ingress-nginx的狀態還是pending,查看原因:

kubectl describe pod ingress-nginx-controller-6bfbdbdd64-jp7lw -n ingress-nginx

原因是現在只有master節點,還沒有node節點,未了節省成本,這裏我們允許 master 參與調度,把 master 節點也當 node 使用。

5.5 允許 master 節點可以被調度

執行:

kubectl taint nodes --all node-role.kubernetes.io/master-

查看 pod 狀態:

kubectl get pod --all-namespaces

pod 均正常運行。到這裏,一個基礎的 k8s 服務基本安裝完成。

體驗 k8s

解析域名

你的測試域名 A 解析到服務器的外網 IP 上,具體步驟略。

創建測試服務 pod

你創建一個部署空間,使用 httpd 作爲一個服務:

kubectl create deployment demo --image=httpd --port=80

kubectl expose deployment demo

創建 ingress 映射

kubectl create ingress demo --class=nginx --rule="k8s.tigerb.cn/*=demo:80"

測試

查看 ingress 服務 service 的外網端口

demopod 啓動成功後訪問http://k8s.tigerb.cn:32374/測試服務即可。

到此爲止,我們就成功部署了一個 k8s 服務,使用 dashborad 就可以很輕鬆完成服務部署、擴容、縮容等。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/tFMU7l1GkkiTZC97mjPjeQ