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

相关推荐
老司机张师傅19 分钟前
【微服务实战之Docker容器】第七章-Dockerfile解析
容器·dockerfile·虚悬镜像·docker学习
登云时刻1 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
redis·kubernetes·bootstrap
运维&陈同学2 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
吴半杯2 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway
Code_Artist4 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
Eternal-Student5 小时前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器
码农小丘5 小时前
一篇保姆式centos/ubuntu安装docker
运维·docker·容器
灼烧的疯狂6 小时前
K8S + Jenkins 做CICD
容器·kubernetes·jenkins
wenyue11217 小时前
Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API
容器·kubernetes·gateway
梅见十柒9 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生