本帖最后由 茎肛互撸娃 于 2023-7-20 04:46 编辑
vmware虚拟机中安装 centos7.9.2009.1 系统
rpm -q centos-release
centos-release-7-9.2009.1.el7.centos.x86_64
然后克隆出两台,改隆出来的这两克台的ip地址,一共3台,1master + 2working
准备机器
主机 |
说明 |
192.168.31.221 |
master节点,能连外网,官网最低要求2核2G |
192.168.31.222 |
working节点,能连外网,官网最低要求2核2G |
192.168.31.223 |
working节点,能连外网,官网最低要求2核2G |
设置 软件包 源为 阿里源(所有节点)
https://developer.aliyun.com/mirror/centos
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
ping www.baidu.com
和 互相节点是否ping通(所有节点)
使用静态ip(所有节点)
[root@localdomain ~] vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" # 改为 static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="b3f6ac89-6926-4990-90b2-074e9d00009d"
DEVICE="ens33"
ONBOOT="yes" # 是否开启自启
IPADDR="192.168.31.211" # ip地址
PREFIX="24" # 子网掩码
GATEWAY="192.168.31.1" # 网关
DNS1="114.114.114.114" # dns
IPV6_PRIVACY="no"
关闭防火墙并设置开机不启动(所有节点)
systemctl stop firewalld --now # 停止防火墙
systemctl disable firewalld # 关闭防火墙开机自启
关闭 SELINUX 安全(所有节点)
setenforce 0
sed -i -r 's/SELINUX=[ep].*/SELINUX=disabled/g' /etc/selinux/config
关闭swap分区(所有节点)
swapoff -a
vim /etc/fstab #永久禁用swap,删除或注释掉/etc/fstab里的swap设备的挂载命令即可
#/dev/mapper/centos-swap swap swap defaults 0 0
修改后重启服务器生效
Centos7内核升级(所有节点)
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,还有会造成kube-proxy不能转发流量
#查看现在的内核版本
uname -a
Linux worker01 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
#查看 yum 中可升级的内核版本
yum list kernel --showduplicates
#如果list中有需要的版本可以直接执行 update 升级,多数是没有的,所以要按以下步骤操作
#导入ELRepo软件仓库的公共秘钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#Centos7系统安装ELRepo
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
#Centos8系统安装ELRepo
yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
#查看ELRepo提供的内核版本
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
#kernel-lt:表示longterm,即长期支持的内核
#kernel-ml:表示mainline,即当前主线的内核
#安装主线内核(32位安装kernek-ml)
yum --enablerepo=elrepo-kernel install kernel-ml.x86_64
#查看系统可用内核,并设置启动项
[root@localdomain ~]# sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (6.3.1-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-1d061b0b4b1e459f9b75c5ee5d8153c9) 7 (Core)
#指定开机启动内核版本
grub2-set-default 0 或者 grub2-set-default 'CentOS Linux (6.3.1-1.el7.elrepo.x86_64) 7 (Core)'
#生成 grub 配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
#重启系统,验证
[root@localdomain ~]# uname -a
Linux k8s-master 6.3.1-1.el7.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Sat Apr 29 09:07:33 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux
设置主机名解析(所有节点)
[root@localdomain ~]# cat /etc/hosts
192.168.31.211 k8s-master
192.168.31.212 k8s-node1
192.168.31.213 k8s-node2
在指定主机上修改主机名
在192.168.31.211上执行: hostnamectl set-hostname k8s-master
在192.168.31.212上执行: hostnamectl set-hostname k8s-node1
在192.168.31.213上执行: hostnamectl set-hostname k8s-node2
时间同步(所有节点)
同步时间,并设置定时任务定时去同步
yum -y install ntpdate
ntpdate ntp1.aliyun.com
echo "0 1 * * * ntpdate ntp1.aliyun.com" >> /var/spool/cron/root
crontab -l
禁用swap交换分区(所有节点)
禁用swap交换分区(kubernetes强制要求禁用)并禁止自启动
swapoff --all
sed -i -r '/swap/ s/^/#/' /etc/fstab
方法1:修改Linux内核参数,添加网桥过滤器和地址转发功能 并加载网桥过滤器模块
cat >> /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p /etc/sysctl.d/kubernetes.conf
modprobe br_netfilter
lsmod | grep br_netfilter # 验证是否生效
方法2:配制iptables规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
设置系统参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
安装docker容器组件(所有节点)
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
# yum-utils软件用于提供yum-config-manager程序
yum install -y yum-utils
# 使用yum-config-manager创建docker阿里存储库(添加 Docker 安装源)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli -y
配置docker加速源(所有节点)
mkdir -p /etc/docker
k8s 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": ["https://aoewjvel.mirror.aliyuncs.com",
"https://zd6lf0p4.mirror.aliyuncs.com",
"https://ud6340vz.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 启动docker并设置开机自启
systemctl daemon-reload
systemctl restart docker
systemctl enable docker --now
#systemctl status docker
安装 cri-dockerd(所有节点)
k8s官方表示1.24或以上版本已不再安装cir,所以这里需要我们手动去安装:
https://github.com/Mirantis/cri-dockerd/releases
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm
#修改/usr/lib/systemd/system/cri-docker.service文件中的ExecStart配置
vim /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
systemctl daemon-reload
systemctl start cri-docker.service
systemctl enable --now cri-docker
systemctl status cri-docker
主节点需要的组件(各组件文档):
- docker 也可以是其他容器运行时
- kubectl 集群命令行交互工具
- kubeadm 集群初始化工具
工作节点需要的组件:
- docker 也可以是其他容器运行时
- kubelet 管理Pod和容器,确保他们健康稳定运行。
- kube-proxy 网络代理,负责网络相关的工作
yum安装kubeadm、kubelet、kubectl(所有节点)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
#查看kubeadm有什么版本
yum list --showduplicates | grep kubeadm
#不指定版本默认为最新版本,截至今天,三个组件的最新版本都为:1.27.3.0
sudo yum install -y kubelet kubeadm kubectl
rpm -qa|grep kubeadm
# kubeadm将使用kubelet服务以容器方式部署kubernetes的主要服务,所以需要先启动kubelet服务
sudo systemctl enable --now kubelet
初始化master节点的控制面板(master节点)
注意:下面都是在master节点上操作,不需要再working节点上操作了!!!
# kubeadm init --help 可以查看命令的具体参数用法
#在master节点执行初始化(node节点不用执行)
#apiserver-advertise-address 指定apiserver的IP,即master节点的IP
#image-repository 设置镜像仓库为国内镜像仓库
#kubernetes-version 设置k8s的版本,跟步骤三的kubeadm版本一致
#service-cidr 这是设置node节点的网络的,暂时这样设置
#pod-network-cidr 这是设置node节点的网络的,暂时这样设置
#cri-socket 设置cri使用cri-dockerd
kubeadm init \
--apiserver-advertise-address=你的master的ip地址 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.27.1 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
关于更多 init 的,看这官方文档
执行上面命令后,会生成如下:
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.31.211:6443 --token 6v0rp3.25uk7u2x03e1vh61 \
--discovery-token-ca-cert-hash sha256:9abf12d2ab254f66a38e1a86164b507283ef27d03ffa8ef39ea90053abcb0d4b
提示以上信息证明你初始化成功
上面输出的信息包含三条语句,作用是复制授权文件,以便kubectl可以有权访问集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
udo chown $(id -u):$(id -g) $HOME/.kube/config
在其他主机上创建 ~/.kube/config 文件也能通过kubectl访问到集群了
还是根据上面的提示来添加节点,下面的命令是在你要加入的节点上执行,master节点不用执行
kubeadm join 192.168.31.211:6443 --token 6v0rp3.25uk7u2x03e1vh61 \
--discovery-token-ca-cert-hash sha256:9abf12d2ab254f66a38e1a86164b507283ef27d03ffa8ef39ea90053abcb0d4b \
--cri-socket unix:///var/run/cri-dockerd.sock # 注意:加上这选项
# 忘记保存 join 了重新获取:`kubeadm token create --print-join-command`
#在master节点检查
[root@localdomain ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 22m v1.27.3
k8s-node1 NotReady <none> 14m v1.27.3
k8s-node2 NotReady <none> 14m v1.27.3
你会发现节点状态全都是 NotReady
添加自动补全功能
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
安装网络插件(flannel)(master节点)
不安装网络插件,node 一直处于 NotReady 状态
在这 地址 上找到这命令并运行:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
备份:
kube-flannel.yml
(4.35 KB, 下载次数: 0)
[root@localdomain ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-b5qcx 1/1 Running 0 12m
kube-flannel kube-flannel-ds-zg56f 1/1 Running 0 12m
kube-flannel kube-flannel-ds-zxltg 1/1 Running 0 12m
kube-system coredns-7bdc4cb885-7jfr8 1/1 Running 0 22m
kube-system coredns-7bdc4cb885-h58cd 1/1 Running 0 22m
kube-system etcd-k8s-master 1/1 Running 0 22m
kube-system kube-apiserver-k8s-master 1/1 Running 0 22m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 22m
kube-system kube-proxy-bzqzn 1/1 Running 0 22m
kube-system kube-proxy-mwgfg 1/1 Running 0 14m
kube-system kube-proxy-rxqq7 1/1 Running 0 14m
kube-system kube-scheduler-k8s-master 1/1 Running 0 22m
# 检查节点
# status为ready就表示集群可以正常运行了
[root@localdomain ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 23m v1.27.3
k8s-node1 Ready <none> 15m v1.27.3
k8s-node2 Ready <none> 15m v1.27.3
除了有 flannel网络组件 外,还有 Calico 网络组件
测试(master节点)
可以进行一个简单的测试
[root@localdomain /data/yaml]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
labels:
app: ceshi
spec:
replicas: 3
selector:
matchLabels:
school: qinghua
template:
metadata:
name: nginx-pod
labels:
school: qinghua
spec:
containers:
- name: nginx-web
image: nginx:1.20.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
role: leader
spec:
type: NodePort
ports:
- port: 8888
targetPort: 80
nodePort: 30000
selector:
school: qinghua
kubectl apply -f nginx.yaml
[root@localdomain ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-6659dbd7c4-4jfks 0/1 ContainerCreating 0 8s
nginx-deploy-6659dbd7c4-bd966 0/1 ContainerCreating 0 8s
nginx-deploy-6659dbd7c4-h72j6 0/1 ContainerCreating 0 8s
这里由于是第一次下载镜像会很慢,等一段时间running就代表完成了
# 查看service状态
Endpoint有ip应该就没问题了
[root@localdomain ~]# kubectl describe svc nginx-service
Name: nginx-service
Namespace: default
Labels: role=leader
Annotations: <none>
Selector: school=qinghua
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.110.190.135
IPs: 10.110.190.135
Port: <unset> 8888/TCP
TargetPort: 80/TCP
NodePort: <unset> 30000/TCP
Endpoints: 10.244.1.2:80,10.244.2.2:80,10.244.2.3:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
注意:k8s1.24版本以后nodeport(使用宿主机端口)在node宿主机不会显示端口,如ss -lntup,直接浏览器nodeip加端口的方式访问给就可以
此时,访问 192.168.31.221:30000、192.168.31.222:30000、192.168.31.223:30000 都能访问到nginx