百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

k8s环境搭建(k8s搭建harbor)

off999 2025-03-28 19:53 19 浏览 0 评论

概述

我在之前的文章中使用VirutBox安装了一个Ubuntu系统,这次我们在这个Ubuntu系统上安装一个k8s集群。
k8s的安装步骤繁多似乎有点复杂,今天我来更新一篇k8s的安装过程。至于我们为什么使用k8s我觉得我不用说太多,我觉得两个关键点:自动化和保证应用健康。

在本地搭建k8s集群有很多种方式:

  1. minikube(最简方式:DockerDesktop+minikube)
  2. Linux + k8s
  3. Kind
  4. MicroK8s
  5. k3s
  6. DockerDesktop

我们这里选择Linux + k8s官方的方式,是想让大家感受一下k8s安装的复杂过程,然后通过安装过程可以很直观的了解到k8s的一些关键点,比如:容器和流量分发。

在做k8s安装时我们还是要做很多选择:

  1. 容器运行时(CRI)使用Docker,Containerd还是其他的
  2. 网络转发用iptables还是ipvs
  3. k8s的网络组件用什么?flannel还是canal还是Calico还是什么?

我们这儿选择了containerd,ipvs和Calico(tigera是公司的名字,这个公司开源了Calico)。

如果你想选择其他比如:docker,iptable, cannel也是可以,根据自己的喜好而定,毕竟是学习类。

我们在安装一些组件使用了Helm,Helm是k8s yaml生成工具,大家先了解下就可以了。

安装过程的组织:

  1. Linux环境配置
  2. Containerd安装
  3. k8s安装
  4. k8s集群初始化
  5. k8s服务部署

k8s版本为:1.28,目前最新版本为1.29

1. 安装K8s

1.1 配置containerd运行环境

创建
/etc/modules-load.d/containerd.conf配置文件,确保在系统启动时自动加载所需的内核模块,以满足容器运行时的要求:

cat << eof> /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

COPY

使配置生效


modprobe overlay
modprobe br_netfilter

COPY

1.2 创建/etc/sysctl.d/99-kubernetes-cri.conf


cat << eof> /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
user.max_user_namespaces=28633
EOF

COPY

配置生效


sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf

COPY

1.3 开启ipvs


cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
EOF

COPY

配置生效


modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh

COPY

安装ipvsadm


apt install -y ipset ipvsadm

COPY

1.5 安装containerd


wget https://github.com/containerd/containerd/releases/download/v1.7.3/containerd-1.7.3-linux-amd64.tar.gz

COPY

解压缩


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

COPY

1.6 安装runc:


wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc

COPY

1.7 生成containerd配置


mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

COPY

配置containerd使用systemd作为容器cgroup driver,大概在136行下面(这个一定要找对地方)


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

COPY


国内已经修改sanbox image为阿里云的Registry,这样就不会有网络访问问题了,大概在65行。

[plugins."io.containerd.grpc.v1.cri"]
  ...
  # sandbox_image = "registry.k8s.io/pause:3.8"
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

COPY

1.8 下载containerd.service

链接:
https://raw.githubusercontent.com/containerd/containerd/main/containerd.service,如果无法下载可以直接复制下面的内容


cat << eof> /etc/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
#Environment="ENABLE_CRI_SANDBOXES=sandboxed"
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
EOF

COPY

1.9 配置Containerd开机启动


systemctl daemon-reload
systemctl enable containerd --now 
systemctl status containerd

COPY

1.10 安装Crictl


wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.28.0/crictl-v1.28.0-linux-amd64.tar.gz
tar -zxvf crictl-v1.28.0-linux-amd64.tar.gz
install -m 755 crictl /usr/local/bin/crictl

COPY

测试Crictl


crictl --runtime-endpoint=unix:///run/containerd/containerd.sock  version

Version:  0.1.0
RuntimeName:  containerd
RuntimeVersion:  v1.7.3
RuntimeApiVersion:  v1

COPY

1.11 更新apt仓库


sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl

COPY

1.12 下载k8s包仓库公钥


curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

COPY

1.13 添加k8s apt 仓库


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

COPY

1.14 安装kubelet, kubeadm和kubelet


sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

COPY

1.15 关闭系统swap


swapoff -a

COPY

永久关闭


vim /etc/fstab

COPY

开机启动kubelet


systemctl enable kubelet

COPY

2. 初始化K8s集群


kubeadm init --apiserver-advertise-address=your_host-only-ip --pod-network-cidr=10.244.0.0/16

COPY

初始化完成后


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

COPY

3. 安装Helm


wget https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz
tar -zxvf helm-v3.12.3-linux-amd64.tar.gz
install -m 755 linux-amd64/helm  /usr/local/bin/helm

COPY

4. 安装k8s网络插件

下载tigera-operator


wget https://github.com/projectcalico/calico/releases/download/v3.26.1/tigera-operator-v3.26.1.tgz

COPY

查看chart中可定制的配置


helm show values tigera-operator-v3.26.1.tgz

COPY

做点简单配置定制,保存为vlaues.yaml


apiServer:
  enabled: false
installation:
  kubeletVolumePluginPath: None

COPY

Heml安装colico


helm install calico tigera-operator-v3.26.1.tgz -n kube-system  --create-namespace -f values.yaml

COPY

等待Pod处于Running


kubectl get pod -n kube-system | grep tigera-operator

COPY

安装kubectl插件


cd /usr/local/bin
curl -o kubectl-calico -O -L  "https://github.com/projectcalico/calicoctl/releases/download/v3.21.5/calicoctl-linux-amd64" 
chmod +x kubectl-calico

COPY

验证是否正常工作


kubectl calico -h

COPY

5. 测试

5.1 验证k8s DNS


kubectl run curl --image=radial/busyboxplus:curl -it
nslookup kubernetes.default

COPY

5.2 发布一个nginx

命令


kubectl apply -f nginx.yaml

COPY

yaml文件如下:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  annotations:
    change-cause: "Rollout test"
spec:
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 200m
          limits:
            cpu: 500m
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 40000
      targetPort: 80
      nodePort: 32000

COPY

命令执行完成后执行

kubectl get pods

COPY

执行结果如下图所示:

6. FAQ

  1. Nameserver limits exceeded" err="Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: 10.22.16.2 10.22.16.254 10.245.0.10"

/run/systemd/resolve/resolv.conf
# 注释掉几个ip

COPY

  1. Master节点作为Node

kubectl taint node k8s-master node-role.kubernetes.io/master:NoSchedule-

COPY

  1. 忘记join集群命令

kubeadm token create --print-join-command

COPY

  1. 部署curl测试

kubectl run curl --image=radial/busyboxplus:curl -it

COPY

  1. kubelet日志查看

journal -xeu kubelet
journal -xeu kubelet > kubelet.log

COPY

  1. kubeadm初始化有问题可以尝试reset后重新初始化

kubeadm reset

COPY

7. 总结

k8s安装步骤还是比较繁杂,不过通过k8s安装过程你可以学习到一些k8s底层原理。k8s是在容器技术之上,使用Linux的流量分发技术并将自己的流量路由规则应用到Linux的分发技术之上。

至于k8s的技术自动化就在于它对于你提出需求的严格保证,这里的需求就是我们发布到K8s应用中的资源需求(比如:几个Replica,多少CPU,多少内存,多少硬盘)。

最后,一个小点,我发现k8s官网域名ICP备案是在北京。

相关推荐

每天一个 Python 库:datetime 模块全攻略,时间操作太丝滑!

在日常开发中,时间处理是绕不开的一块,比如:生成时间戳比较两个时间差转换为可读格式接口传参/前端展示/日志记录今天我们就用一个案例+代码+思维导图,带你完全搞定datetime模块的用法!...

字节跳动!2023全套Python入门笔记合集

学完python出来,已经工作3年啦,最近有很多小伙伴问我,学习python有什么用其实能做的有很多可以提高工作效率增强逻辑思维还能做爬虫网站数据分析等等!!最近也是整理了很多适合零基...

为什么你觉得Matplotlib用起来困难?因为你还没看过这个思维导图

前言Matplotlib是一个流行的Python库,可以很容易地用于创建数据可视化。然而,设置数据、参数、图形和绘图在每次执行新项目时都可能变得非常混乱和繁琐。而且由于应用不同,我们不知道选择哪一个图...

Python新手必看!30分钟搞懂break/continue(附5个实战案例)

一、跳转语句的使命当程序需要提前结束循环或跳过特定迭代时,break和continue就是你的代码急刹按钮和跳步指令。就像在迷宫探险中:break=发现出口立即离开continue=跳过陷阱继续前进二...

刘心向学(24)Python中的数据类(python中5种简单的数据类型)

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。今天小编为大家带来文章“刘心向学(24)Python中的数据类”欢迎您的访问。Shareinterest,...

刘心向学(25)Python中的虚拟环境(python虚拟环境安装和配置)

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。今天小编为大家带来文章“刘心向学(25)Python中的虚拟环境”欢迎您的访问。Shareinte...

栋察宇宙(八):Python 中的 wordcloud 库学习介绍

分享乐趣,传播快乐,增长见识,留下美好。亲爱的您,这里是LearingYard学苑!今天小编为大家带来“Python中的wordcloud库学习介绍”欢迎您的访问!Sharethefun,...

AI在用|ChatGPT、Claude 3助攻,1分钟GET高颜值思维导图

机器之能报道编辑:Cardinal以大模型、AIGC为代表的人工智能浪潮已经在悄然改变着我们生活及工作方式,但绝大部分人依然不知道该如何使用。因此,我们推出了「AI在用」专栏,通过直观、有趣且简洁的人...

使用DeepSeek + Python开发AI思维导图应用,非常强!

最近基于Deepseek+PythonWeb技术开发了一个AI对话自动生成思维导图的应用,用来展示下如何基于低门槛的Python相关技术栈,高效结合deepseek实现从应用场景到实际应用的快速落地...

10幅思维导图告诉你 - Python 核心知识体系

首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典,集合),条件&循环,文件对象,错误&异常,函数,模块,面向对象编程;接着,结合这些思维导图主要参考的...

Python基础核心思维导图,让你轻松入门

Python基础核心思维导图【高清图文末获取】学习路线图就给大家看到这里了,需要的小伙伴下方获取获取方式看下方图片...

Python基础核心思维导图,学会事半功倍

Python基础核心思维导图【高清图文末获取】学习路线图就给大家看到这里了,需要的小伙伴下方获取获取方式看下方图片...

硬核!288页Python核心知识笔记(附思维导图,建议收藏)

今天就给大家分享一份288页Python核心知识笔记,相较于部分朋友乱糟糟的笔记,这份笔记更够系统地总结相关知识,巩固Python知识体系。文末获取完整版PDF该笔记学习思维导图:目录内容展示【领取方...

Python学习知识思维导图(高效学习)

Python学习知识思维导图python基础知识python数据类型条件循环列表元组字典集合字符串序列函数面向对象编程模块错误异常文件对象#python##python自学##编程#...

别找了!288页Python核心知识笔记(附思维导图,建议收藏)

今天就给大家分享一份288页Python核心知识笔记,相较于部分朋友乱糟糟的笔记,这份笔记更够系统地总结相关知识,巩固Python知识体系。文末获取完整版PDF该笔记学习思维导图:目录内容展示【领取方...

取消回复欢迎 发表评论: