k8s打怪升级之路----(1)搭建一个简单的集群

文章目录

  • 准备阶段
    • 规划节点
      • 节点名字(可选)
    • 下载安装包
      • containerd
      • runc
      • cni-plugin
      • cilium
      • hlem
      • go
      • k9s
    • 安装组件
      • install go
      • install go mod
      • install containerd
      • install runc
      • install CNI plugin
      • install kubeadm、kubelet 和 kubectl
    • 进行配置
      • 关闭swap
      • 配置iptables
      • 配置containerd.service
      • 配置containerd
        • 配置containerd.service
        • 配置国内镜像源
        • 配置 `systemd` cgroup 驱动
        • 重启 congtainerd.service
      • 初始化CNI
  • 启动阶段
    • master节点
      • 初始化集群
      • 生成cluster config文件
    • node节点
  • 配置部署节点
    • copy cluster config文件到部署节点
    • install kubectl
    • install helm
    • install k9s
  • 部署应用
    • 网络组件
      • install cilium
    • 测试用例
      • 部署busybox
  • 检查集群状态
    • 查看节点状态
    • 查看 Pod状态
    • 检查集群内部网络
  • ***搞定***

准备阶段

规划节点

准备linux服务器(配置随意,不能小于2C/2G ),规划哪些服务器作为master节点,那些作为node节点。
我准备了4台服务器,一台作为master节点,2台作为node节点,有一台不加入集群的服务器作为部署节点。

[!tip]
部署节点不是必须的,集群中的任何节点都可以执行部署操作

节点名字(可选)

给每个节点起名字,然后将其配置到每个服务器的 /etc/hosts

[!tip]
默认Pod不会调度到master节点,只会在node节点调度

下载安装包

containerd

  • containerd-releases :
    从github现在最新release版本
  • containerd.service 文件
  • go.mod

runc

  • runc-releases

cni-plugin

  • plugins-releases
  • 初始化脚本

cilium

  • releases

hlem

  • releases

go

  • Download

k9s

  • release

安装组件

所有节点(服务器)都需要进行下列操作

[!tip]
有条件的使用 root 用户进行下列操作,非root用户也是可以的,只是我是使用root进行的操作

install go

  1. rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.1.linux-amd64.tar.gz
  2. 添加export PATH=$PATH:/usr/local/go/bin/etc/profile
  3. source /etc/profile
  4. go version

执行下列命令

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.1.linux-amd64.tar.gz

配置环境变量,添加下列内容到 /etc/profile

export PATH=$PATH:/usr/local/go/bin

执行下列命令使环境变量生效

source /etc/profile

验证

go version

install go mod

[!attention]
我不懂GO,所以containerd go mod我是直接从github下载文件放到了go的目录中

mkdir -p /usr/local/go/bin/src/github.com/containerd/containerd/
cp go.mod /usr/local/go/bin/src/github.com/containerd/containerd/

install containerd

解压[[#containerd|准备阶段]] 下载的 containerd-x.x.x-llinux-amd64.tar.gz 解压到 /usr/local 目录

tar Cxzvf /usr/local containerd-1.6.8-linux-amd64.tar.gz

install runc

通过下列命令将[[#runc#|准备阶段]] 下载的runc. 安装到/user/sbin/ 目录

install -m 755 runc.amd64 /usr/sbin/runc

install CNI plugin

通过下列命令将[[#cni-plugin|准备阶段]] 下载的 cni-plugins-xxx-xxx-vxxxx.tgz 解压到 /opt/cni/bin 目录

mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz

install kubeadm、kubelet 和 kubectl

cat <

进行配置

关闭swap

编辑 /etc/fstab 注释 swap 行

配置iptables

cat <

配置containerd.service

将[[#准备阶段#containerd#|准备阶段]] 下载的containerd.service文件复制到/usr/lib/systemd/system/,然后执行下列命令:

systemctl daemon-reload
systemctl enable --now containerd

配置containerd

配置containerd.service

将[[#准备阶段#containerd#|准备阶段]] 下载的containerd.service文件复制到/usr/lib/systemd/system/,然后执行下列命令:

systemctl daemon-reload
systemctl enable --now containerd

通过下面命令生成containerd默认配置文件

containerd config default > /etc/containerd/config.toml

[!tip]
遇到no such file or directory: /etc/containerd/config.toml报错,通过下列命令创建目录

mkdir -p /etc/containerd/

遇到command not found: containerd,查询 containerd位置

whereis containerd

结果输出containerd: /usr/local/bin/containerd,将输出目录添加到$PATH

配置国内镜像源

修改 /etc/containerd/config.toml 文件

修改sandbox_image的镜像

[plugins."io.containerd.grpc.v1.cri"]
    sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"

修改registry的镜像源

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://xxxxxx.mirror.aliyuncs.com", "https://registry-1.docker.io"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"] 
    endpoint = ["registry.aliyuncs.com/google_containers"]

[!tip]
xxxx.mirror.aliyuncs.com 需要到阿里云注册获取,每个帐号有一个独立的地址。

配置 systemd cgroup 驱动

/etc/containerd/config.toml 中设置 SystemdCgrouptrue

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

重启 congtainerd.service

sudo systemctl restart containerd

初始化CNI

执行[[#cni-plugin|准备阶段]] 下载的初始化cni的脚本

启动阶段

master节点

初始化集群

[!tip]
如果规划的master节点有多个,只需要在第一个master节点进行初始化

通过下列命令初始化节点

kubeadm init \
--control-plane-endpoint= \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--token=  \
--token-ttl=0 \
--apiserver-advertise-address= \
--pod-network-cidr=10.0.0.0/16 \
--node-name=master

[!note]
--control-plane-endopoint : 配置control plane的域名,如果没有配置dns,需要在每个服务器上配置 /etc/hosts
--image-repository : 镜像源地址,我使用的阿里云的源
--token :配置集群的token,其他节点加入集群的时候使用, 格式: “[a-z0-9]{6}.[a-z0-9]{16}” 不使用此参数会自动生成一个
--token-ttl : token过期时间(例如 1 s,2 m,3 h),默认为 24h0m0s。如果设置为 ‘0’,则令牌将永不过期。
--apiserver-advertise-address : master 节点的IP地址
--pod-nwework-cidr 这个是配置集群内部使用的网段
--node-name 节点的名字(可以不添加此参数,默认为服务器的hostname)

命令执行成功之后会有如下输出

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/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join :6443 --token  \
	--discovery-token-ca-cert-hash  \
	--control-plane 

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join :6443 --token  \
	--discovery-token-ca-cert-hash 

[!tip]
输出中的jion命令,带有 --control-plane 参数的是添加master节点(管理节点)到集群中,另一个为添加node节点(work节点)到集群中。

生成cluster config文件

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

node节点

通过下列命令把node节点加入集群

kubeadm join \
:6443 \
--token  \
--discovery-token-ca-cert-hash  \
--node-name=node1

[!tip]
: 初始化集群的时候配置的 --control-plane-endopoint 参数的值
--token : 初始化集群配置的token,直接复制初始化集群之后的输出内容中的 token使用即可
--discovery-token-ca-cert-hash : 直接复制初始化集群之后的输出内容中的 hash使用即可
--node-name : 节点的名字(可以不添加此参数,默认为服务器的hostname)

配置部署节点

copy cluster config文件到部署节点

mkdir -p $HOME/.kube
cp config $HOME/.kube/

[!tipe]
config文件来自master节点,目录在执行初始化集群操作的用户的 $HOME/.kube/ 目录
如果选择在执行初始化集群命令的服务器上进行部署操作,可以跳过这步。
如果选择在其他节点的服务器上进行部署操作,需要执行此步

install kubectl

参考 [[#install kubeadm、kubelet 和 kubectl|安装组件]] 安装kubectl

install helm

tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

[!tip]
有些虚机可能没有将 /usr/local/bin 目录加入到 $PATH

install k9s

  1. 解压
  2. copy k9s to /usr/local/bin

部署应用

网络组件

install cilium

sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
cilium install

查看一下状态

cilium status

k8s打怪升级之路----(1)搭建一个简单的集群_第1张图片

测试用例

部署busybox

创建一个 busybox.yaml 文件,将下列内容写入文件中

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: busybox
  labels:
    app: guestbook
    tier: busybox
spec:
  replicas: 2
  selector:
    matchLabels:
      tier: busybox
  template:
    metadata:
      labels:
        tier: busybox
    spec:
      containers:
      - name: busybox
        image: busybox:1.28
        command:
          - sleep
          - "3600"
        imagePullPolicy: IfNotPresent
      restartPolicy: Always

执行下列命令,部署busybox到集群中

kubectl apply -f busybox.yaml

检查集群状态

通过k9s查看并测试集群

执行命令,进入k9s界面。

k9s

查看节点状态

ESC,然后 按 ,然后输入 node, 然后按 Enter。 然后看看 STATUS 列是否都是 Ready
k8s打怪升级之路----(1)搭建一个简单的集群_第2张图片

查看 Pod状态

进入k9s之后,按,然后输入 pods,然后按 enter , 然后按 0,就可以看到类似下面的内容. 查看 READYSTATUS 是否正常。

[!info]
k9s的详细操作,可以参考官网.

k8s打怪升级之路----(1)搭建一个简单的集群_第3张图片

检查集群内部网络

通过方向键选中 busybox 的pod,NAME以 busybox开头。然后按 S 进入pod shell。 (需要提前记录一下另一个 busybox的 IP)

[!tip]
IP 列展示的是Pod在集群内部的IP地址

ping 10.0.0.44 -c 4
PING 10.0.0.44 (10.0.0.44): 56 data bytes
64 bytes from 10.0.0.44: seq=0 ttl=63 time=0.974 ms
64 bytes from 10.0.0.44: seq=1 ttl=63 time=0.684 ms
64 bytes from 10.0.0.44: seq=2 ttl=63 time=0.702 ms
64 bytes from 10.0.0.44: seq=3 ttl=63 time=0.659 ms

--- 10.0.0.44 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss

搞定

你可能感兴趣的:(kubernetes,kubernetes,linux,运维)