所有分类
  • 所有分类
  • 未分类

Ubuntu安装K8S(1.28版本,基于containrd)

简介

本文介绍Ubuntu安装K8S的方法。

官网文档:这里

本文用到的文件

上边.yaml是要用到的文件,.yaml.bak是原始配置文件(仅用于备份)。

文件下载地址

1.安装K8S

1.让apt支持SSL传输

sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates

2.下载 gpg 密钥

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - 

3.添加 k8s 镜像源

创建/etc/apt/sources.list.d/kubernetes.list文件,并添加阿里的K8S源。

sudo touch /etc/apt/sources.list.d/kubernetes.list
sudo vi /etc/apt/sources.list.d/kubernetes.list

添加的内容如下:

deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

4.安装k8s

更新软件源

sudo apt-get update

查看版本

sudo apt-cache madison kubeadm
sudo apt-cache madison kubelet
sudo apt-cache madison kubectl

三个软件的版本都是下边这样(我为了只看前几行,加了个| head -20,否则会输出很多) 

安装指定版本(本处我安装最新版本(1.28.2-00))

sudo apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00

kubeadm用于初始化环境,kubectl用于操作kubelet。 

5.启动k8s

启动k8s

sudo systemctl start kubelet

设置开机启动

sudo systemctl enable kubelet

6.命令自动补全

 这几个命令没有自动补全,用起来不方便。启用自动补全的方法见:这里

2.配置K8S环境

执行命令时有时候会报下边错误,不用管它。报错原因:去k8s官网查看发布版列表,但是国内访问不了这个网站,连不上;此时会自动使用本地客户端的版本,本处是:1.28.2。

1.禁用防火墙和swap

这两步必须操作!不然k8s无法正常运行。

1.禁用防火墙

sudo systemctl stop ufw
sudo systemctl disable ufw

2.禁用swap

修改/etc/fstab文件,将swap所在的行注释掉

2.预检

执行安装之前,会做一系列的系统预检查,以确保主机环境符合安装要求,如果检查失败,就直接终止,不进行init操作。因此可以通过命令执行预检查操作,确保系统就绪后再进行init操作。会检查内存大小等。

sudo kubeadm init phase preflight

到这一步一般会报错:

原因是:默认关闭了cri(容器运行时),需要启用它。 本处先不处理,下边第4步安装容器运行时之后,这个就解决了。

3.网络设置

转发 IPv4 并让 iptables 看到桥接流量。 官网:这里

执行如下指令:

1.向k8s.conf写入两行配置并启用它

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

2.设置所需的 sysctl 参数,参数在重新启动后保持不变

下边命令会向k8s.conf写入三行内容

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

3.应用 sysctl 参数而不重新启动

sudo sysctl --system

4.安装容器运行时

官网:这里

需要在集群内每个节点上安装一个容器运行器以使 Pod 可以运行在上面。容器运行器实现了CRI(容器运行时接口),常见的容器运行器有:

  1. containerd
  2. CRI-O
  3. Docker(使用 cri-dockerd 适配器来将 Docker 与 Kubernetes 集成)
  4. Mirantis Container Runtime

我是用containerd,这是现在最常用的。做完上边第一步(1.安装K8S)后,默认会安装contrainerd,可以用此命令查看:

ctr -v

结果

1.生成配置并修改

先切换到root用户,然后执行如下命令:

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

会生成配置文件:/etc/containerd/config.toml,修改如下配置项 :

修改1:修改cgroup为systemd

原内容

SystemdCgroup = false

修改为

SystemdCgroup = true

kubelet 的 cgroup 驱动 默认是systemd,这里需要保持一致。详见:官网

修改2:沙箱使用阿里云的源

原内容

sandbox_image = "registry.k8s.io/pause:3.6"

修改为

sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"

修改3:使用国内的镜像源

在plugins.”io.containerd.grpc.v1.cri”.registry.mirrors下边添加如下内容:

内容为:

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
        endpoint = ["https://ustc-edu-cn.mirror.aliyuncs.com", "https://hub-mirror.c.163.com"]
      
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
        endpoint = ["registry.aliyuncs.com/google_containers"]

2.重启containerd

修改完毕后,重启containerd

sudo systemctl daemon-reload
sudo systemctl restart containerd

让containerd开机自启

sudo systemctl enable containerd

5.搭建K8S集群

方案概述:使用kubeadm init命令创建master节点,然后再用kubeadm join命令创建node节点并加入master。

1.下载镜像

为了加快kubeadm创建集群的过程,可以预先下载所有镜像。

查看镜像

kubeadm config images list --image-repository=registry.aliyuncs.com/google_containers

结果

下载镜像(阿里云)

kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers

结果 

2.部署 master

1.初始化master

sudo kubeadm init \
  --apiserver-advertise-address 192.168.5.193 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.2 \
  --service-cidr 10.100.0.0/16 \
  --pod-network-cidr 10.96.0.0/16
参数说明
apiserver-advertise-addressAPI 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口
image-repository镜像拉取的仓库,填写国内镜像源
kubernetes-versionK8s 版本,本文值为 v1.28.2
service-cidr为服务的虚拟 IP 地址另外指定 IP 地址段。默认值:“10.96.0.0/12”
pod-network-cidr指明 Pod 网络可以使用的 IP 地址段。如果使用 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 192.168.5.193:6443 --token nml0zp.6uiyj1ncjxd33py6 \
        --discovery-token-ca-cert-hash sha256:64b2ebebff8317034b8ae401ce6481d62fa1aeff5c2d78781bed4990055a6836

备注

如果你想重新kubeadm init,可以先kubeadm reset,再kubeadm init。 

2.配置环境 

执行上边的命令:

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

3.查看状态

查看节点状态

kubectl get nodes

结果

可以发现,是“NotReady” 状态,因为还没有安装网络插件(不用管它,后边会安装网络插件)。

查看pods状态

kubectl get pods -A

结果

4.安装网络插件

K8S中网络架构是很重要的。CNI(Container Network Interface)意为容器网络接口,它是一种标准设计,目的是进行数据转发、让用户在容器创建或销毁时能够更容易地配置容器网络。

CNI网络插件只在master安装即可。

有如下常见的CNI网络插件产品:

  1. Flannel(比较常用。简单易用,但缺乏高级功能,例如配置网络策略和防火墙)
  2. Calico(最常用。高性能、高灵活性、功能强大)
  3. Weave
  4. Canal

本文使用Calico。

1.下载calico配置文件

先创建个文件夹,用于存放配置文件:

mkdir -p /work/devops/k8s/config
cd /work/devops/k8s/config

下载calico配置文件 

wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml

2.修改calico配置文件

vi calico.yaml

原来的配置

# - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"

修改后的配置(注意:value与上边kubeadm init的–pod-network-cidr参数保持一致)

- name: CALICO_IPV4POOL_CIDR
  value: "10.96.0.0/12"

3.启用calico

kubectl apply -f ./calico.yaml

结果:

5.再次查看状态

需要过一会儿才会成为正常状态

查看节点状态

kubectl get nodes

结果

查看pod状态 

kubectl get pods -A

或者:

kubectl get pods -n kube-system

结果

3.部署node节点(非必须)

将上边的部署命令复制下来,到node机器上去执行即可。

kubeadm join 192.168.5.193:6443 --token nml0zp.6uiyj1ncjxd33py6 \
        --discovery-token-ca-cert-hash sha256:64b2ebebff8317034b8ae401ce6481d62fa1aeff5c2d78781bed4990055a6836

注意:这段kubeamd join命令的token只有24h,24h就过期,在master上执行kubeadm token create –print-join-command 重新生成。

4.部署dashboard

见:Ubuntu安装k8s的dashboard(管理页面)-自学精灵

1

评论18

请先

  1. kubectl get pods -A显示 kube-controller-manager 和kube-scheduler 有的时候CrashLoopBackOff,有的时候Error
    梧の桐 2024-08-29 0
    • 可以看下这里:https://way2j.com/a/2956
      自学精灵 2024-08-29 0
  2. 卡在初始化master
    last明天 2024-08-26 0
    • 可以检查下,是不是步骤有差错。不行可以重新操作一遍
      自学精灵 2024-08-27 0
  3. calico配置文件 是不是还有其他地方要改啊,一直是Init:ImagePullBackOff
    lvdefa 2024-07-12 0
    • 其他地方没有了。这里有K8S常见的问题及解决方案:way2j.com/a/category/%e6%8a%80%e6%9c%af/devops-%e8%bf%90%e7%bb%b4/k8s/%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3-k8s
      自学精灵 2024-07-12 0
  4. 镜像检查的时候是正常的。镜像拉取的时候就不行了,是咋回事呀 I0712 12:37:22.689053 8930 version.go:256] remote version is much newer: v1.30.2; falling back to: stable-1.28 failed to pull image "registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.11": output: E0712 12:37:24.337753 8959 remote_image.go:171] "PullImage from image service failed" err="rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/containerd/containerd.sock: connect: permission denied\"" image="registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.11" time="2024-07-12T12:37:24+08:00" level=fatal msg="pulling image: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/containerd/containerd.sock: connect: permission denied\"" , error: exit status 1 To see the stack trace of this error execute with --v=5 or higher
    lvdefa 2024-07-12 0
    • 这个报错我没遇到过。可以重新操作一遍,或者去网上搜一下这个报错。
      自学精灵 2024-07-12 0
  5. 禁用防火墙命令改为:sudo systemctl stop ufw
    褪墨 2024-06-26 0
    • 少打了一个字母,已修复。
      自学精灵 2024-06-26 1
  6. Port 10250 is in use这个报错重新安装一次就没有出现了
    梧の桐 2024-05-14 0
  7. sudo kubeadm init \ --apiserver-advertise-address 192.168.5.193 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.28.2 \ --service-cidr 10.100.0.0/16 \ --pod-network-cidr 10.96.0.0/16 报错Port 10250 is in use
    梧の桐 2024-05-14 1
  8. 没有二进制部署k8s的教程嘛? :cry:
    梧の桐 2024-05-13 1
    • 没有。二进制太麻烦了
      自学精灵 2024-05-14 0
  9. calico 启动那块儿老是pending,calico-node总是Init:ImagePullBackOff 求教大佬怎么处理呀
    jackyq 2024-04-06 0
    • 首先,检查一下本文的步骤自己是否有遗漏,可以直接重新做一遍。如果还不行,可以看下这个文章:https://way2j.com/a/2956
      自学精灵 2024-04-07 0
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录