使用经常使用的kubeadm来构建Kubernetes验证环境

简介

我整理了一下关于我在Kubernetes环境中经常使用的kubeadm的构建方法,这对于进行验证非常有用。
我认为在编写关于Kubernetes的文章时也可以作为参考再利用,所以我进行了整理。

本文讨论的目标

    • kubernetesを触り始めた方

 

    • kubeadmでKubernetesを構築してみたい方

 

    複数台のノードでのKubernetesを構築してみたい方

关于kubeadm

个人而言,我经常使用一种工具来在像Ubuntu这样的环境上构建Kubernetes环境,这种工具相对比较简单。使用”kubeadm init”进行设置,使用”kubeadm join”参加集群,这些操作都非常容易实施。关于详细操作,请查看官方文档。

建立程序

组成图

image.png

所有机器的通用设置

首先,我们需要在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
image.png

最后 (zuì

我在这里总结了使用kubeadm进行Kubernetes构建的内容。
作为一种方便利用Kubernetes的环境,我认为AKS和GKE等非常实用。
然而,如果您有虚拟机等能够准备多个机器的环境,
我也认为这个选项非常适合初次接触的用户,因为非常容易准备。

广告
将在 10 秒后关闭
bannerAds