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 的外網端口
demo
pod 啓動成功後訪問http://k8s.tigerb.cn:32374/
測試服務即可。
到此爲止,我們就成功部署了一個 k8s 服務,使用 dashborad 就可以很輕鬆完成服務部署、擴容、縮容等。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/tFMU7l1GkkiTZC97mjPjeQ