使用经常使用的kubeadm来构建Kubernetes验证环境
简介
我整理了一下关于我在Kubernetes环境中经常使用的kubeadm的构建方法,这对于进行验证非常有用。
我认为在编写关于Kubernetes的文章时也可以作为参考再利用,所以我进行了整理。
本文讨论的目标
-
- kubernetesを触り始めた方
-
- kubeadmでKubernetesを構築してみたい方
- 複数台のノードでのKubernetesを構築してみたい方
关于kubeadm
个人而言,我经常使用一种工具来在像Ubuntu这样的环境上构建Kubernetes环境,这种工具相对比较简单。使用”kubeadm init”进行设置,使用”kubeadm join”参加集群,这些操作都非常容易实施。关于详细操作,请查看官方文档。
建立程序
组成图
所有机器的通用设置
首先,我们需要在Master和Worker中进行共同的设置。
禁用交換领域
为了使用kubelet,必须先满足没有启用swap分区的前提条件,否则需要将其禁用。
※如果要在机器重启后持续禁用swap分区,请在/etc/fstab文件中将swapfile的条目注释掉。
sudo swapoff –a
# 永続的なswap領域無効化
sudo vi /etc/fstab
禁用防火墙
为了进行验证等用途,暂时将防火墙全部禁用。
sudo systemctl stop ufw
sudo systemctl disable ufw
请安装apt-transport-https。
为了在https下载apt软件包,我们需要安装一个可以实现这一功能的软件包。
sudo apt-get install apt-transport-https
Kubernetes仓库的注册
为了下载与Kubernetes相关的软件包,将进行仓库注册。
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/kubernetes.list << EOF >/dev/null
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt update
安装与Kubernetes相关的软件包。
通过安装相关的Kubernetes包来启动kubeadm。
在下面的指南中,我们提供了每个版本的指定,但您也可以选择不指定版本来安装最新版本或根据您的环境自行指定版本。
sudo apt-get install -y kubelet=1.24.3-00 kubeadm=1.24.3-00 kubectl=1.24.3-00 docker.io=20.10.12-0ubuntu2~20.04.1
在Ubuntu上,您可以使用以下命令来检查可下载的软件包作为参考。
apt-cache show kubelet | grep Version
设置Overlay网络
为了使用Kubernetes上的超集网络,需要更改核心参数。
sudo sysctl net.bridge.bridge-nf-call-iptables=1
以上就是全台通用的最基本设置已完成。
设置MasterNode所需的机器
接下来,我们将在MasterNode上进行设置。
执行kubeadm init
使用kubeadm init命令进行Kubernetes的设置。
kubeadm init似乎执行了kubelet的启动和证书的创建等操作。
※在pod-network-cidr参数中,根据本次使用的CNI(Flannel)要求,指定为”10.244.90.0/16″。
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
执行kubeadm init命令时,输出的最后会有以下类似的命令记录。
请记下这个命令,以备后续设置WorkerNode时使用。
kubeadm join 172.22.18.211:6443 --token (以降省略)
kubeconfig的配置
我会设置kubeconfig以便执行kubectl命令。
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config
用法包括Flannel(CNI)的部署。
我们将使用Flannel作为在Pod之间通信等方面使用的CNI进行部署。
在官方的github上也有相关的配置文件,我们可以直接使用。
Flannel的github页面
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.19.1/Documentation/kube-flannel.yml
以上内容完成了MasterNode的设置。
工作节点的机器设置
将进行WorkerNode的设置,但这里只需要一个步骤,即加入先前建立的MasterNode集群。
加入Kubernetes集群
在先前设置MasterNode时,我想你已经记下了通过kubeadm init输出的命令。
然后在每个WorkerNode上执行该命令。
# IPアドレス等は環境に合わせて変更ください
kubeadm join 172.22.18.211:6443 --token (以降省略)
#出力
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
如果能够顺利加入Kubernetes集群,那么WorkerNode的基本配置就已经完成了。
确认参与集群的节点
回到MasterNode,使用以下命令确认WorkerNode是否成功加入集群。如果状态显示为Ready,就表示没有问题。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
ubuntu-kube11 Ready control-plane 3h19m v1.24.3
ubuntu-kube12 Ready <none> 3h4m v1.24.3
ubuntu-kube13 Ready <none> 177m v1.24.3
这是使用kubeadm构建Kubernetes的方法。
尝试部署Nginx
既然如此,我們也趁機在構建的Kubernetes環境中進行動作確認,試著構建nginx的Pod。
部署Nginx
让我们尝试使用以下清单文件部署Nginx。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
kubectl apply -f deployment.yaml
确认已创建的Pod的运行情况。
我会确认所创建的Pod的IP,并使用curl命令检查是否返回HTML。
kubectl get pods -o wide
#出力
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6c8b449b8f-62zhh 1/1 Running 0 16s 10.244.2.3 ubuntu-kube13 <none> <none>
nginx-6c8b449b8f-zrgpc 1/1 Running 0 16s 10.244.1.2 ubuntu-kube12 <none> <none>
由于这次在清单中将复制品(replicas)设置为2,所以创建了两个Pod。
此外,在查看输出的节点列表时,可以确认Pod分别创建在两个工作节点(Worker Node)上。
现在我们尝试向其中一个IP发送curl请求。
curl 10.244.2.3
# 出力
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
~~
省略
~~
</html>
可以确认收到了nginx的欢迎页面信息,并且成功确认nginx正在运行。
将nginx外部公开
我知道到目前为止最终是通过curl运行的,但是为了实际在浏览器中进行确认,我也想尝试设置外部公开的负载均衡器。
这次我将尝试使用Metallb作为负载均衡器。
通过Metallb进行部署。
进行Metallb的部署。
与Flannel时一样,使用GitHub上的清单文件进行部署。将直接使用metallb GitHub。
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.1/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.1/manifests/metallb.yaml
配置 configmap
为了定义用于Metallb的协议、群集对外的IP地址池等,将部署以下清单中的configmap。
※请在您的环境中提供可用的地址来填写addresses的IP池。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.22.18.216-172.22.18.220
使用预先准备的清单进行部署。
kubectl apply -f configmap.yaml
部署Nginx Pod的负载均衡器。
已经完成了使用Metallb的准备工作,现在最后部署一个用于nginx的service。
这个service将成为之前部署的nginx pod的入口。
下面是一个参考的manifest示例。
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-lb
name: nginx-lb
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
使用预先准备的清单进行部署。
kubectl apply -f service.yaml
检查部署的服务时,您可以确认EXTERNAL-IP。
这个EXTERNAL-IP将成为集群的对外IP地址。
kubectl get svc nginx-lb
#出力
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-lb LoadBalancer 10.102.105.222 172.22.18.216 8080:30333/TCP 43s
最后 (zuì
我在这里总结了使用kubeadm进行Kubernetes构建的内容。
作为一种方便利用Kubernetes的环境,我认为AKS和GKE等非常实用。
然而,如果您有虚拟机等能够准备多个机器的环境,
我也认为这个选项非常适合初次接触的用户,因为非常容易准备。