什么是kubeadm
kubeadm是一种命令行工具,主要用于Kubernetes集群的创建和管理。它可以自动配置和初始化一个Kubernetes master节点,也可以给工作节点拉取必要的Kubernetes组件。
kubeadm主要特性包括:
- Bootstrap:kubeadm可以初始化一个Kubernetes master或将一个Kubernetes工作节点添加到集群。
- 安全设置:kubeadm自动生成了所有需要的证书,并设置好了kubeconfig和授权模式。
- 控制平面的高可用性:kubeadm可以创建出高可用(HA)的Kubernetes集群控制平面。
- 插件的管理:kubeadm可以管理Kubernetes的各种插件,比如网络插件和节点引导插件。
简单来说,如果你想快速方便地部署Kubernetes集群,kubeadm是一个很好的工具。
---- by gpt-4
实践服务器
- 服务器1(计划用于Master节点)
提供商:DigitalOcean
配置:2C/4G/80GB Disk
系统:Debian 12
位置:美国旧金山(SFO3)
- 服务器2(计划用于Worker节点)
提供商:DigitalOcean
配置:1C/2G/50GB Disk
系统:Debian 12
位置:美国旧金山(SFO3)
安装步骤
本文以root用户操作,如果你不使用root用户,命令前可能需要加 sudo
在服务器1中的操作
安装docker:curl https://get.docker.com | sh
**安装kubeadm:**见官方文档,命令总结如下。
apt-get update
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
接下来应该执行 kubeadm init
,但是kubeadm无法正确的找到docker,错误如下所示:
root@k8sadm:~# kubeadm init
[init] Using Kubernetes version: v1.28.2
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: time="2023-09-25T02:18:38Z" level=fatal msg="validate service connection: validate CRI v1 runtime API for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
因此还需要安装cri-dockerd:
从官方releases下载合适的包:https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd_0.3.4.3-0.debian-bullseye_amd64.deb
安装它:dpkg -i cri-dockerd_0.3.4.3-0.debian-bullseye_amd64.deb
配置systemd守护进程:vi /etc/systemd/system/cri-dockerd.service
写入以下内容:
[Unit]
Description=cri-dockerd
After=network.target
[Service]
ExecStart=/usr/bin/cri-dockerd
Restart=on-failure
[Install]
WantedBy=multi-user.target
然后 systemctl daemon-reload
systemctl start cri-dockerd
systemctl enable cri-dockerd
初始化集群:kubeadm init --cri-socket=unix:///var/run/cri-dockerd.sock --pod-network-cidr=10.244.0.0/16
这条命令中的 --pod-network-cidr
参数是为后续安装Flannel网络插件做准备,如果你不使用Flannel,可无需指定。
命令执行完成后会看到类似输出:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 143.198.*.*:6443 --token p72hkf.xn4xkr2vtso8eho4 \
--discovery-token-ca-cert-hash sha256:872e5c65d777b968b11f9061db83179dcedbb75a82b161dc8d27569ec3d6dd73
安装Flannel网络插件:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
应该会看到Flannel网络已经在你的集群中正确运行了。
你可以使用以下命令查看Pod的网络:
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .status.containerStatuses[*]}{.ready}{", "}{end}{end}'
输出:
kube-flannel-ds-xd6sl: true,
kube-flannel-ds-z27lx: true,
coredns-5dd5756b68-9pngq: true,
coredns-5dd5756b68-px726: true,
etcd-k8sadm: true,
kube-apiserver-k8sadm: true,
kube-controller-manager-k8sadm: true,
kube-proxy-bkqrv: true,
kube-proxy-c75sx: true,
kube-scheduler-k8sadm: true,
在服务器2中的操作
在服务器1对集群初始化时,输出了集群的对接命令。
在服务器2中安装docker、cri-dockerd、kubelet、kubeadm、kubectl后,执行对接命令。
在服务器1中的操作
验证你的安装:kubectl get nodes
root@k8sadm:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8sadm Ready control-plane 86m v1.28.2
worker3 Ready <none> 83m v1.28.2
status栏显示 Ready
就可以了。
应用部署步骤
nginx被称作k8s世界的hello world,所以我们部署一个nginx的deployment。
部署操作均在服务器1(Master节点)执行。
下面开始~
为了导入配置,首先需要配置Config Map。
新建你的nginx配置文件:vi default.conf
输入内容(示例):
server {
listen 80;
location / {
proxy_pass http://154.16.248.181:8081;
}
}
创建一个名字为"nginx-conf"的Config Map:kubectl create configmap nginx-conf --from-file ~/default.conf
后续如要修改配置,可以使用:kubectl edit cm nginx-conf
"cm"是"configmap"的简写。
配置Nginx Deployment
新建你的deployment配置文件:vi nginx.yaml
写入以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 1
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: nginx-conf-volume
mountPath: /etc/nginx/conf.d/default.conf
subPath: default.conf
- name: nginx-log
mountPath: /var/log/nginx
volumes:
- name: nginx-conf-volume
configMap:
name: nginx-conf
- name: nginx-log
hostPath:
path: /var/log/nginx
这个k8s配置文件中关于存储的配置如下:
- 创建了两个卷:
- 名称为nginx-conf-volume的配置映射卷,使用的配置映射资源为nginx-conf。
- 名称为nginx-log的主机路径卷,使用的主机目录为/var/log/nginx。
- 在容器中使用了volumeMounts字段来挂载这两个卷:
- 对于nginx-conf-volume卷,将其挂载到容器的/etc/nginx/conf.d/default.conf路径,并将其中的default.conf文件作为子路径挂载。
- 对于nginx-log卷,将其挂载到容器的/var/log/nginx路径。
这样配置后,容器中的nginx进程可以读取配置文件/etc/nginx/conf.d/default.conf,并将日志写入/var/log/nginx目录中。
----by gpt-3
启动这个nginx deployment:kubectl apply -f ~/nginx.yaml
观察运行状态:
root@k8sadm:~# kubectl apply -f ~/k8s-yaml/nginx.yaml
deployment.apps/my-nginx created
root@k8sadm:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-nginx-69775c989f-xgrdw 1/1 Running 0 16s 10.244.1.5 worker3 <none> <none>
root@k8sadm:~# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx 1/1 1 1 21s
最后,需要配置相关的端口映射服务,使应用能被外部访问。
配置NodePort Service
新建你的service配置文件:vi node-port-service.yaml
写入以下内容:
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
run: my-nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
注意spec-selector中的配置,确保该服务service绑定pod。
启动服务:kubectl create -f ./node-port-service.yaml
观察运行状态:
root@k8sadm:~# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h43m
nginx-service NodePort 10.107.115.33 <none> 80:30393/TCP 4m15s
访问相关worker的IP:Port,应该可以正常访问。
大功告成!