此文首發於我的Jekyll博客:zhang0peter的個人博客
如果你想要從零開始搭建自己的k8s集羣參考我的這篇博客,預計花費時間爲1天:從零開始在ubuntu上安裝和使用k8s集羣及報錯解決
自己搭建k8s集羣的難點之一是需要3臺ubuntu虛擬機,要求電腦至少10G內存:操作系統4G內存,3臺虛擬機需要6G內存。
另一個難度是對初學者來說,搭建太複雜了。
如果你不想手動搭建集羣,只想體驗和使用kubernetes集羣,推薦使用digitalocean
的kubernetes
集羣服務,自動搭建,無需安裝。
digitalocean
的kubernetes
集羣提供3臺ubuntu虛擬機(node),每臺1核CPU,2G內存,共30$一個月,體驗一天只要1$。
通過我的鏈接在digitalocean
註冊的新用戶,可以獲得100美元的2個月使用權,相當於前2個月免費用:DigitalOcean – sign up
創建kubernetes集羣后,DO會提醒你使用kubectl
或者doctl
操作集羣,我推薦kubectl
這個通用工具。
在本地linux上安裝kubectl
,通過 kubectl 操作 k8s 集羣。
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo gpg --keyserver keyserver.ubuntu.com --recv-keys BA07F4FB #對安裝包進行簽名
sudo gpg --export --armor BA07F4FB | sudo apt-key add -
sudo apt-get update
sudo apt install kubectl
安裝完成後下載yaml配置文件到目錄~/.kube
,然後運行:
-> # cd ~/.kube && mv k8s-zhang0peter-kubeconfig.yaml config
-> # kubectl get nodes
NAME STATUS ROLES AGE VERSION
pool-7wa24lnka-v3sf Ready <none> 11m v1.16.2
pool-7wa24lnka-v3sq Ready <none> 11m v1.16.2
pool-7wa24lnka-v3sy Ready <none> 8m8s v1.16.2
可以看到集羣的狀態是Ready
部署前先創建命名空間,防止污染:
-> # kubectl create namespace flask-test
namespace/flask-test created
-> # kubectl get namespace
NAME STATUS AGE
default Active 169m
flask Active 30m
flask-test Active 65s
kube-node-lease Active 169m
kube-public Active 169m
kube-system Active 169m
部署單個 pod
編輯flask-pod.yaml
文件如下:
apiVersion: v1
kind: Pod
metadata:
name: flask-pod
labels:
app: flask-helloworld
spec:
containers:
- name: flask
image: registry.cn-hangzhou.aliyuncs.com/zhang0peter/flask:v0
ports:
- containerPort: 5000
部署應用:
-> # kubectl apply -f flask-pod.yaml -n flask-test
pod/flask-pod created
-> # kubectl get pod -n flask-test
NAME READY STATUS RESTARTS AGE
flask-pod 1/1 Running 0 12s
轉發端口並訪問:
-> # kubectl port-forward pods/flask-pod 5000:5000 -n flask-test
Forwarding from 127.0.0.1:5000 -> 5000
Handling connection for 5000
-> % curl http://127.0.0.1:5000
hello world!
刪除 Pod:
-> # kubectl delete pod flask-pod -n flask-test
pod "flask-pod" deleted
部署 Deployment
編寫flask-deployment.yaml
文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-dep
labels:
app: flask-helloworld
spec:
replicas: 2
selector:
matchLabels:
app: flask-helloworld
template:
metadata:
labels:
app: flask-helloworld
spec:
containers:
- name: flask
image: 'registry.cn-hangzhou.aliyuncs.com/zhang0peter/flask:v0'
ports:
- containerPort: 5000
部署 Deployment:
-> # kubectl apply -f flask-deployment.yaml -n flask-test
deployment.apps/flask-dep created
-> # kubectl get deploy -n flask-test
NAME READY UP-TO-DATE AVAILABLE AGE
flask-dep 2/2 2 2 12s
-> # kubectl get pod -n flask-test
NAME READY STATUS RESTARTS AGE
flask-dep-56bcc4b6c5-44gkv 1/1 Running 0 25s
flask-dep-56bcc4b6c5-kkkvl 1/1 Running 0 25s
轉發端口並訪問:
-> # kubectl port-forward deployment/flask-dep 5000:5000 -n flask-test
Forwarding from 127.0.0.1:5000 -> 5000
Handling connection for 5000
-> % curl http://127.0.0.1:5000
hello world!
不要刪除Deployment,後面還要用。
部署負載均衡應用
編寫flask-service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: flask-svc
labels:
app: flask-helloworld
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 5000
protocol: TCP
selector:
app: flask-helloworld
部署 LoadBalancer 負載均衡:
-> # kubectl apply -f flask-service.yaml -n flask-test
service/flask-svc created
-> # kubectl get service -n flask-test
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
flask-svc LoadBalancer 10.245.139.6 <pending> 80:32349/TCP 9s
等待約5分鐘,負載均衡實現,對外暴露端口:
-> # kubectl get service -n flask-test
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
flask-svc LoadBalancer 10.245.139.6 139.59.194.75 80:32349/TCP 4m23s
-> # curl 139.59.194.75
hello world!
刪除 service
-> # kubectl delete service flask-svc -n flask-test
service "flask-svc" deleted
部署結束。
參考: