章工运维 章工运维
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

章工运维

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • ansible系列文章

  • Kubernetes笔记

    • 安装篇-kubeadm
      • 1、基础配置
      • 安装containerd
      • 安装k8s 1.32.0
      • 安装Calico网络插件
      • 安装ingress-nginx控制器
      • 部署 MetalLB 来为集群提供 LoadBalancer 功能
      • 小试牛刀
    • k8s入门
    • k8s安装篇二进制
    • k8s面试题
    • kubernetes(k8s)yaml文件详解
    • k8s报错小结
    • Kubernetes 安装配置ingress controller
    • cka考试真题
    • ingress配置证书
    • cka考试作业
    • k8s部署java项目
    • jenkins脚本式流水线部署k8s项目实例一
    • helm v3安装并创建例子
    • 使用helm将本地部署文件上传到harbor chart上
    • helm公共仓库创建
    • helm适应minio作为私有仓库
    • helm release使用说明
    • kubernetes核心概念
    • kubectl使用技巧
    • kubernetes卷的几种类型
    • kubernetes安全框架
    • 云原生-什么是HPA和PDB、VPA
    • k8s部署php项目示例
    • 配置kubeconfig 文件访问 Kubernetes 集群
    • configmap配置的几种方式
    • k8s配置go服务
    • k8s部署java项目
    • kubernetes部署prometheus监控
    • kubernetes部署elk日志系统
    • kubernetes环境devops流水线
    • kubernetes高阶技能必备的工具
    • deployment中使用configmap、secret的方式
    • 业务pod 飘移pending排查分析
  • elk

  • jenkins

  • GitLabCI_CD

  • 专题
  • Kubernetes笔记
章工运维
2023-04-24
目录

安装篇-kubeadm

# Kubernetes 1.32版本集群部署

# 1、基础配置

  • 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  #永久关闭,需要重启
setenforce 0 #临时关闭
1
2
  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
1
2
  • 修改主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
1
2
3
  • 修改网络为固定IP
sudo nmcli con mod ens160 ipv4.addresses 192.168.1.100/24
sudo nmcli con mod ens160 ipv4.gateway 192.168.1.1
sudo nmcli con mod ens160 ipv4.dns "8.8.8.8"
sudo nmcli con mod ens160 ipv4.method manual
sudo nmcli con down ens160 && sudo nmcli con up ens160
1
2
3
4
5
  • 关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab
1
2
  • 添加时间同步
#修改时区,同步时间
yum install chrond -y
vim /etc/chrony.conf
-----
# 阿里云 NTP
server ntp.aliyun.com iburst
server time1.aliyun.com iburst
# 腾讯云 NTP
server ntp.tencent.com iburst
# 中国科学院国家授时中心
server ntp.ntsc.ac.cn iburst
-----
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone
#重启
systemctl restart chronyd
#查看时间源状态
chronyc sources -v
#立即同步
chronyc -a makestep
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 系统优化
vi /etc/sysctl.d/k8s_better.conf 
# 启用桥接的IPv4和IPv6流量过滤,确保iptables能处理桥接流量。
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1

# 启用IPv4转发,用于容器间的网络通信。
net.ipv4.ip_forward=1

# 禁止内存交换(swapping),即不使用swap空间,减少磁盘I/O延迟,适合内存密集型工作负载。
vm.swappiness=0

# 设置内存分配策略为“总是成功”。
vm.overcommit_memory=1

# 当内存不足时,允许内核丢弃进程而不是在OOM时崩溃。
vm.panic_on_oom=0

# 增加inotify监视器实例的最大数量,适用于高频率文件监控。
fs.inotify.max_user_instances=8192

# 增加inotify可监视的文件数量,适用于高频率文件监控。
fs.inotify.max_user_watches=1048576

# 设置最大文件描述符数,允许更多并发文件打开。
fs.file-max=52706963

# 设置最大打开文件数,容器或高并发应用可能会用到更多的文件描述符。
fs.nr_open=52706963

# 禁用IPv6,通常为了减少不必要的网络流量或提高安全性。
net.ipv6.conf.all.disable_ipv6=1

#设置网络连接跟踪表的最大连接数,适用于大规模的网络环境。
net.netfilter.nf_conntrack_max=2310720

执行
modprobe br_netfilter
lsmod |grep conntrack
modprobe ip_conntrack
sysctl -p /etc/sysctl.d/k8s_better.conf 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  • 修改hosts
192.168.51.46 k8s-master01
192.168.51.47 k8s-node1
192.168.51.48 k8s-node2 
1
2
3
  • 更换默认源,安装epel(非必须)
【推荐阿里源】
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-*.repo

dnf makecache

【配置Epel 镜像】
下载新repo到/etc/yum.repos.d/
epel(RHEL 8)
1)安装 epel 配置包
yum install -y epel-release
2)将 repo 配置中的地址替换为阿里云镜像站地址
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • 安装依赖包
yum -y install wget jq psmisc vim net-tools nfs-utils socat telnet device-mapper-persistent-data lvm2 git tar curl -y


yum install -y conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
1
2
3
4
  • 开启ipvs转发
yum install ipvsadm ipset sysstat conntrack libseccomp -y
--------------------------


modprobe br_netfilter 

mkdir /etc/sysconfig/modules
vi /etc/sysconfig/modules/ipvs.modules

#!/bin/bash 
modprobe -- ip_vs 
modprobe -- ip_vs_rr 
modprobe -- ip_vs_wrr 
modprobe -- ip_vs_sh 
modprobe -- nf_conntrack


chmod 755 /etc/sysconfig/modules/ipvs.modules 

bash /etc/sysconfig/modules/ipvs.modules 

lsmod | grep -e ip_vs -e nf_conntrack
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  • 设置系统句柄数为最大
ulimit -SHn 65535
cat >> /etc/security/limits.conf <<EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* seft memlock unlimited
* hard memlock unlimitedd
EOF

#查看修改结果
ulimit -a
1
2
3
4
5
6
7
8
9
10
11
12
  • 如果使用的是vmware克隆机,还需检查uuid
cat /sys/class/dmi/id/product_uuid
1

# 安装containerd

创建配置文件

【3台机器全部执行】
创建 /etc/modules-load.d/containerd.conf 配置文件
----------------------
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
----------------------
modprobe overlay
modprobe br_netfilter
1
2
3
4
5
6
7
8
9
10

配置源文件

获取阿里云YUM源
vim /etc/yum.repos.d/docker-ce.repo
------------------
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/9/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
----------------------
yum makecache

下载安装:
yum install -y containerd.io
1
2
3
4
5
6
7
8
9
10
11
12
13
14

配置config文件

3台机器全部执行
生成containerd的配置文件

mkdir /etc/containerd -p
生成配置文件
containerd config default > /etc/containerd/config.toml
编辑配置文件
vim /etc/containerd/config.toml
------------
SystemdCgroup = false 改为 
【搜索】:/SystemdCgroup
SystemdCgroup = true   //第139行

sandbox_image = "k8s.gcr.io/pause:3.6"
改为:
【搜索】:/sandbox_image
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"  //第67行
-----------
设置开机启动
systemctl enable containerd
启动服务
systemctl start containerd
查看镜像,验证安装是否成功
ctr images ls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 安装k8s 1.32.0

1、配置k8s yum源

3台机器全部配置

#添加阿里云YUM软件源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
EOF
-------------
# 清除原有 yum 缓存
yum clean all
# 生成新的缓存
yum makecache
1
2
3
4
5
6
7
8
9
10
11
12
13
14

2、查看所有可用的版本

yum list kubelet --showduplicates | sort -r |grep 1.32
1

3、安装kubeadm,kubelet和kubectl

3台机器全部执行,默认安装最新版本1.32.0
yum install -y kubectl kubelet kubeadm
1
2
会自动安装5个包,明细如下:
cri-tools-1.32.0-150500.1.1.x86_64    
kubeadm-1.32.0-150500.1.1.x86_64    
kubectl-1.32.0-150500.1.1.x86_64    
kubelet-1.32.0-150500.1.1.x86_64    
kubernetes-cni-1.6.0-150500.1.1.x86_64
1
2
3
4
5
6

4、配置cgroup

为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。
vim /etc/sysconfig/kubelet [3台全部设置下]
---------------------
添加
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
---------------------
设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
1
2
3
4
5
6
7
8

5、准备k8s 1.32.0镜像

kubeadm config images list --kubernetes-version=v1.32.1
1

6、拉取镜像

使用以下命令从阿里云仓库拉取镜像 [3台都执行安装]
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
1
2

7、集群初始化

集群初始化 【主机76安装即可】
使用kubeadm init命令初始化

在lyc-80-76上执行,报错请看k8s报错汇总
vim kubeinit.sh
. ./kubeinit.sh
-------------------------------------
kubeadm init --kubernetes-version=v1.32.0 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.80.76 --image-repository registry.aliyuncs.com/google_containers
------------------------------------------
--apiserver-advertise-address 集群通告地址
--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
--kubernetes-version K8s版本,与上面安装的一致
--service-cidr 集群内部虚拟网络,Pod统一访问入口
--pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14

安装成功提示

[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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.51.46:6443 --token 7a3yak.7qs7326t28m0ww3f \
        --discovery-token-ca-cert-hash sha256:5cadea570e7168fc56bf0c805b9e8debd9a1d427e172f6e6bc5b00d09757c40c 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
根据提示,主节点执行下提示信息
mkdir -p $HOME/.kube

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

export KUBECONFIG=/etc/kubernetes/admin.conf
1
2
3
4
5
6
7

8、node节点加入集群

lyc-80-77/lyc-80-78 分别执行
kubeadm join 192.168.51.46:6443 --token 7a3yak.7qs7326t28m0ww3f \
        --discovery-token-ca-cert-hash sha256:5cadea570e7168fc56bf0c805b9e8debd9a1d427e172f6e6bc5b00d09757c40c
1
2
3

9、查看集群节点

# 查看集群节点:
kubectl get node
1
2

# 安装Calico网络插件

网络组件有很多种,只需要部署其中一个即可,推荐Calico。

Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。

Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器(vRouter)来负责数据转发,
而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。

此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。
*******************************************

github地址:https://github.com/projectcalico/calico
下载Calico配置文件
wget  https://docs.projectcalico.org/manifests/calico.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
这里我用的是提前准备好的配置文件
还记得初始化k8s集群时填的这个地址不?
--pod-network-cidr=10.224.0.0/16
安装网络插件calico的时候,配置成这个地址才行

vim calico.yaml
---------------
注意看2个地方的配置
搜索查看文件:
:/CALICO_IPV4POOL_CIDR


:/image   修改镜像地址
-------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#修改文件中镜像地址为可以拉取镜像的地址
     sed -i s#docker.io/calico/cni:v3.25.0#docker.cnb.cool/zzppjj/docker-images/cni:v3.25.0#g calico.yaml 
     sed -i s#docker.io/calico/node:v3.25.0#docker.cnb.cool/zzppjj/docker-images/node:v3.25.0#g calico.yaml 
     sed -i s#docker.io/calico/kube-controllers:v3.25.0#docker.cnb.cool/zzppjj/docker-images/kube-controllers:v3.25.0#g calico.yaml
部署calico网络
calico.yaml

kubectl apply -f calico.yaml
1
2
3
4
5
6
7
8
查看网络
kubectl get node
kubectl get nodes -o wide
kubectl get pods --all-namespaces -o wide

等待几分钟查看pod情况
kubectl get node -A
kubectl get pod -n kube-sysrem
1
2
3
4
5
6
7
8

# 安装ingress-nginx控制器

下载部署文件

https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml
1

修改镜像,并执行安装

#修改下载部署文件的镜像地址
vi deploy.yaml
docker.cnb.cool/zzppjj/docker-images/controller:v1.12.0
docker.cnb.cool/zzppjj/docker-images/kube-webhook-certgen:v1.5.0
kubectl apply -f deploy.yaml
1
2
3
4
5

检查 ingress-nginx 控制器的 Service

kubectl get svc -n ingress-nginx
1

# 部署 MetalLB 来为集群提供 LoadBalancer 功能

官方网站部署步骤:Installation :: MetalLB, bare metal load-balancer for Kubernetes (opens new window)

修改kube-proxy 配置

kubectl edit configmap -n kube-system kube-proxy
将strictARP值改成: true
1
2

下载部署文件

 wget https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
1

修改部署文件的配置镜像,改成下方地址

docker.cnb.cool/zzppjj/docker-images/controller:v0.13.10
docker.cnb.cool/zzppjj/docker-images/speaker:v0.13.10
1
2

执行部署

kubectl apply -f metallb-native.yaml
1

创建metallb地址池

vi metallb-ippool.yaml
#添加如下内容
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: localip-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.51.100-192.168.51.102
  autoAssign: true
  avoidBuggyIPs: true
1
2
3
4
5
6
7
8
9
10
11
12

通过网卡对外通告

vi metallb-l2.yaml
#添加如下内容
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: localip-pool-l2a
  namespace: metallb-system
spec:
  ipAddressPools:
  - localip-pool
  interfaces:
  - ens160
1
2
3
4
5
6
7
8
9
10
11
12

执行启动

kubectl apply -f metallb-ippool.yaml
kubectl apply -f metallb-l2.yaml
1
2

检查对外的ip是否关联上

# 小试牛刀

部署前端web程序

# deplyment文件,如果没有配置,去掉相关环境变量的配置即可
apiVersion: apps/v1
kind: Deployment
metadata:
  name: resume-frontend
  labels:
    app: resume
spec:
  replicas: 1
  selector:
    matchLabels:
      app: resume
  template:
    metadata:
      labels:
        app: resume
    spec:
      containers:
      - name: resume-container
        image: docker-images/resume:latest  # 建议使用具体版本标签
        ports:
        - containerPort: 3000
        resources:
          requests:
            memory: "256Mi"
            cpu: "100m"
          limits:
            memory: "512Mi"
            cpu: "200m"
        livenessProbe:
          httpGet:
            path: /
            port: 3000
          initialDelaySeconds: 15
          periodSeconds: 20
        readinessProbe:
          httpGet:
            path: /
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 10

---
apiVersion: v1
kind: Service
metadata:
  name: resume-service
spec:
  type: LoadBalancer
  selector:
    app: resume
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000

---
# Ingress 配置(需要集群已安装 Ingress Controller)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: resume-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /  # Nginx Ingress 专用注解
spec:
  ingressClassName: nginx  # 指定 Ingress 控制器类型
  rules:
  - host: resume.example.com  # 修改为您的域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: resume-service
            port:
              number: 80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

应用完整配置

kubectl apply -f deployment.yaml
1

查看Ingress 分配的外部 IP

kubectl get ingress resume-ingress
1

DNS 配置

将域名 resume.example.com 解析到 Ingress 控制器的外部 IP
1

完整流量路径

客户端 -> Ingress (resume.example.com) -> Service (resume-service) -> Pod (resume-frontend)

# docker与crictl命令对照表

镜像相关功能 Docker Containerd
显示本地镜像列表 docker images crictl images
下载镜像 docker pull crictl pull
上传镜像 docker push 无,例如buildk
删除本地镜像 docker rmi crictl rmi
查看镜像详情 docker inspect IMAGE-ID crictl inspect IMAGE-ID

​

容器相关功能 Docker Containerd
显示容器列表 docker ps crictl ps
创建容器 docker create crictl create
启动容器 docker start crictl start
停止容器 docker stop crictl stop
删除容器 docker rm crictl rm
查看容器详情 docker inspect crictl inspect
附加容器 docker attach crictl attach
执行命令 docker exec crictl exec
查看日志 docker logs crictl logs
查看容器资源 docker stats crictl stats

​

POD 相关功能 Docker Containerd
显示 POD 列表 无 crictl pods
查看 POD 详情 无 crictl inspectp
运行 POD 无 crictl runp
停止 POD 无 crictl stopp

参考链接

第四十八节 Rocky9.5 安装 k8s v1.32.0 底层走containerd_大数据仓库工程师的技术博客_51CTO博客 (opens new window)

k8s之基于metallb实现LoadBalancer型Service - 一炁化三清 - 博客园 (opens new window)

微信 支付宝
上次更新: 2025/03/26, 15:55:49

← 如何优雅向chatgpt提问ansible相关问题 k8s入门→

最近更新
01
不花一分钱从0到1建站教程
04-22
02
批量拿取多台服务器的日志文件
04-21
03
高德MCP智能体搞定旅游计划
04-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 | 点击查看十年之约 | 鄂ICP备2024072800号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式