centos7.9安装k8s 1.3
- k8s环境规划:
- 安装containerd服务
- 安装初始化k8s需要的软件包
- 扩容k8s集群-添加第一个工作节点
- 安装kubernetes网络组件-Calico
- 测试在k8s创建pod是否可以正常访问网络和coredns
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