centos7.9安装k8s 1.3

centos7.9安装k8s 1.3

k8s环境规划:

物理机网段:192.168.40.0/24

podSubnet(pod网段) 10.244.0.0/16

serviceSubnet(service网段): 10.96.0.0/12

初始化

master执行修改主机名

python 复制代码
hostnamectl set-hostname k8smaster1 && bash

node执行修改主机名

python 复制代码
hostnamectl set-hostname k8snode1 && bash

关闭selinux

python 复制代码
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

修改每台机器的/etc/hosts文件

python 复制代码
vim /etc/hosts
python 复制代码
192.168.40.120   k8smaster1  
192.168.40.121   k8snode1  

关闭交换分区swap,提升性能

python 复制代码
swapoff -a
python 复制代码
vim /etc/fstab
#/dev/mapper/centos-swap swap      swap    defaults        0 0

修改机器内核参数

python 复制代码
modprobe br_netfilter
python 复制代码
vim /etc/sysctl.d/k8s.conf 
python 复制代码
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
#net.bridge.bridge-nf-call-ip6tables这个参数启用了 IPv6 的iptables netfilter hook,允许 Linux 内核在网络层面上进行 IPv6 数据包的过滤和处理。在 Kubernetes 中,这个参数通常需要启用,因为 Kubernetes 网络通常是基于 iptables 实现的,而且在一些网络插件中可能会使用到 IPv6。这个参数的启用确保了 Linux 内核在处理 IPv6 数据包时会经过 iptables 过滤,从而确保网络功能的正常运行。
#net.bridge.bridge-nf-call-iptables 这个参数启用了 IPv4 的iptables netfilter hook,类似于前一个参数,但是针对 IPv4 数据包。它允许 Linux 内核在网络层面上进行 IPv4 数据包的过滤和处理。在 Kubernetes 中,这个参数通常需要启用,因为 Kubernetes 网络通常是基于 iptables 实现的,而且在一些网络插件中可能会使用到 Ipv4。这个参数的启用确保了 Linux 内核在处理 Ipv4 数据包时会经过 iptables 过滤,从而确保网络功能的正常运行。
#net.ipv4.ip_forward  这个参数启用了 Linux 内核的 IP 转发功能,允许 Linux 主机将收到的数据包从一个网络接口转发到另一个网络接口。在 Kubernetes 中,Pod 可能会跨越多个节点进行通信。例如,当一个 Pod 需要访问另一个 Pod 或外部服务时,网络流量可能需要通过不同的节点进行路由。启用 IP 转发功能允许 Linux 主机将收到的数据包从一个网络接口转发到另一个网络接口,从而实现跨节点通信。

sysctl 将读取 /etc/sysctl.d/k8s.conf 文件中的参数,并将其应用到当前系统。

python 复制代码
sysctl -p /etc/sysctl.d/k8s.conf

关闭firewalld防火墙

python 复制代码
systemctl stop firewalld ; systemctl disable firewalld

如需开启防火墙

python 复制代码
kube-apiserver端口是6443,etcd端口是2379、2380,kube-controller-manager端口是10257, kube-scheduler端口是10259,kubelet端口10250,Kube-proxy:默认使用动态分配的端口(TCP/UDP),通常在 1024 到 65535 之间。calico端口TCP 179,UDP4789,TCP5743,UDP4789,443

例如

python 复制代码
firewall-cmd --zone=public --add-port=6443/tcp --permanent
firewall-cmd --reload

配置时间同步

python 复制代码
yum install ntpdate -y
ntpdate cn.pool.ntp.org
python 复制代码
crontab -e
* *  * * * /usr/sbin/ntpdate   cn.pool.ntp.org
python 复制代码
systemctl restart crond

修改网卡配置

python 复制代码
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak
python 复制代码
vi /etc/sysconfig/network-scripts/ifcfg-ens33
#UUID ifcfg-ens33.bak的,其他都修改
python 复制代码
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens33
UUID=47ae7c92-d10d-4409-aa48-5891ff6fcf95
DEVICE=ens33
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.40.120
NETMASK=255.255.255.0
GATEWAY=192.168.40.2
DNS1=192.168.40.2
PREFIX=24
python 复制代码
service network restart

两台服务器都执行 配置阿里yum源

python 复制代码
vim /etc/yum.repos.d/CentOS-Base.repo
python 复制代码
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

安装常用命令

python 复制代码
yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack telnet ipvsadm

配置国内安装docker和containerd的阿里云在线源

python 复制代码
yum install yum-utils -y
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装containerd服务

在 Kubernetes 中,当一个 Pod 被创建时,Kubernetes 会根据 Pod 中定义的容器信息,将它们交给容器运行时来创建和运行。
安装containerd

python 复制代码
yum install containerd.io-1.6.22*  -y
cd /etc/containerd
rm -rf *

上传config.toml

修改config.toml配置文件里的harbor的ip地址,变成自己真实环境的harbor的ip

修改镜像仓库为3.9

python 复制代码
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"
python 复制代码
systemctl start containerd && systemctl enable containerd
systemctl restart containerd 

安装初始化k8s需要的软件包

配置安装k8s组件需要的阿里云的repo源

python 复制代码
cat >  /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF
python 复制代码
yum clean all && yum makecache

每台都执行

python 复制代码
yum install -y kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0
systemctl enable kubelet

kubeadm初始化k8s集群

只在k8smaster1操作

python 复制代码
cd ~
kubeadm config print init-defaults > kubeadm.yaml

根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,需要注意的是由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd

python 复制代码
vim kubeadm.yaml 
python 复制代码
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.40.120 #控制节点的ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock  #指定containerd容器运行时
  imagePullPolicy: IfNotPresent
  name:  xianchaomaster1 #控制节点主机名
  taints: null
---
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #指定阿里云镜像仓库地址,这样在安装k8s时,会自动从阿里云镜像仓库拉取镜像
kind: ClusterConfiguration
kubernetesVersion: 1.30.0 #k8s版本
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16 #指定pod网段, 需要新增加这个
  serviceSubnet: 10.96.0.0/12 #指定Service网段
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

基于kubeadm.yaml初始化k8s集群

python 复制代码
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

显示如下,说明安装完成:

配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理

python 复制代码
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

扩容k8s集群-添加第一个工作节点

master执行

python 复制代码
kubeadm token create --print-join-command
python 复制代码
显示如下:
kubeadm join 192.168.40.120:6443 --token g3gs5n.copis3bit4b4uuqi \
        --discovery-token-ca-cert-hash sha256:6ddc85fbd2dd77e4ff1815289f6a7483dc3f14b610ddbf9f9a375fc826848000

把k8snode1加入k8s集群

python 复制代码
kubeadm join 192.168.40.120:6443 --token g3gs5n.copis3bit4b4uuqi \
        --discovery-token-ca-cert-hash sha256:6ddc85fbd2dd77e4ff1815289f6a7483dc3f14b610ddbf9f9a375fc826848000 --ignore-preflight-errors=SystemVerification

master执行

python 复制代码
kubectl get nodes

给node打标签

python 复制代码
kubectl label nodes k8snode1 node-role.kubernetes.io/work=work
python 复制代码
kubectl get nodes
kubectl get pods -n kube-system -owide

安装kubernetes网络组件-Calico

1)支持网络隔离和多租户场景;

2)为pod提供独立的IP地址;

3)支持跨主机的容器通信,pod可以通过IP地址直接互相访问;

4)提供网络安全策略,支持网络流量控制和访问授权,实现网络安全隔离。

把安装calico和calico.yaml需要的镜像calico.tar.gz传到k8smaster1和k8snode1节点,手动解压:

python 复制代码
ctr -n=k8s.io images import calico.tar.gz

calico.yaml文件需要做如下修改

  • 在安装 Calico 网络插件时,指定 IP_AUTODETECTION_METHOD 环境变量是为了确保该插件能够在正确的网络接口上自动检测 Pod IP 地址。这个环境变量的值 "interface=ens33" 指定了 Calico 插件使用 ens33 接口来分配 IP 地址给 Kubernetes Pod,而不是使用默认的自动检测方式。
  • 通常情况下,Kubernetes Pod 中容器的 IP 地址是由容器运行时(如 Docker 或 CRI-O)自动分配的。但是,对于某些网络插件(如 Calico)来说,为了能够正确地配置网络,需要手动指定使用哪个网络接口来自动检测 Pod IP 地址。
  • 因此,在安装 Calico 网络插件时,需要通过 IP_AUTODETECTION_METHOD 环境变量来指定使用 ens33 接口来分配 IP 地址给 Kubernetes Pod。这样可以确保 Calico 插件能够正确地配置 Pod 网络。
  • 如果你网卡接口地址是eth0,那就改成value: "interface=eth0"
python 复制代码
vim calico.yaml
python 复制代码
- name: IP_AUTODETECTION_METHOD
  value: "interface=ens33"
python 复制代码
kubectl apply -f  calico.yaml
kubectl get node
kubectl get pods -n kube-system -owide

测试在k8s创建pod是否可以正常访问网络和coredns

把busybox-1-28.tar.gz上传到k8snode1节点,手动解压

python 复制代码
ctr -n k8s.io images import busybox-1-28.tar.gz

在master执行

python 复制代码
kubectl run busybox --image docker.io/library/busybox:1.28  --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh
python 复制代码
ping www.baidu.com
nslookup kubernetes.default.svc.cluster.local

注意:busybox要用指定的1.28版本,不能用最新版本,最新版本,nslookup会解析不到dns和ip

相关推荐
运维老郭2 小时前
【K8s运维实战】Kubernetes临时存储卷实战:emptyDir核心用法与gitRepo弃用迁移指南
运维·云原生·kubernetes
AAA@峥6 小时前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
十年磨一剑~8 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka
gs801409 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui10 小时前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
江湖有缘11 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
鸿儒51713 小时前
MR-50国产化GPU docker配置方法
docker·容器·mr
Zhu75814 小时前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
Akamai中国14 小时前
Akamai收购安全企业浏览器提供商LayerX
人工智能·云原生·云计算·云服务