找回密码
 立即注册
快捷导航

[Docker/K8s] Kubernetes/k8s安装 vmware+CentOS7*3

[复制链接]
茎肛互撸娃 2023-7-19 21:52:42 | 显示全部楼层

本帖最后由 茎肛互撸娃 于 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(所有节点)

Kubernetes/k8s安装 vmware+CentOS7*31433 作者:茎肛互撸娃 帖子ID:511 k8s官方表示1.24或以上版本已不再安装cir,所以这里需要我们手动去安装:
https://github.com/Mirantis/cri-dockerd/releases
Kubernetes/k8s安装 vmware+CentOS7*33824 作者:茎肛互撸娃 帖子ID:511

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
备份: Kubernetes/k8s安装 vmware+CentOS7*33680 作者:茎肛互撸娃 帖子ID:511 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

回复

使用道具 举报

主题

0

回帖

1100

积分
 楼主| 茎肛互撸娃 2023-7-20 00:24:31 | 显示全部楼层
参考:
https://cloud.tencent.com/developer/article/2287512
https://blog.csdn.net/m0_57911290/article/details/131314573   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2024-11-23 00:36

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表