1.VMware安装CentOS7.9

教程对应的视频在这里:【CentOS安装K8S】
【CentOS安装K8S】https://www.bilibili.com/video/BV1cR4y1f7Ac?vd_source=ea882d9dfce8a0fba409d76e63c9e024

1.1CPU 4核 内存 4G 磁盘100G

1.2改IP为静态地址

1.2.1查看IP

  • ip addr

    ens33为动态分配的IP ,一会将其设为静态地址

image-20221114085229137

1.2.2 进入配置文件目录

  • cd /etc/sysconfig/network-scripts/

img

  • 编辑配置文件

    vim ifcfg-ens33

在这里插入图片描述

​ (1)首先更改BOOTPROTO为static

​ (2) 其次更改ONBOOT为yes,用于设置是否开机启动

​ (3)然后增加静态IP、子网掩码、网关IP参数

​ 第一个参数是你需要设置的静态IP地址

      第二个参数是子网掩码,和我们截图中的应该相同,也就是它:

​ 第三个参数是网关IP,和我们截图中的应该相同,也就是它:

​ 那么根据上面的解释,我的这三个参数可以设置一下了,例如:

​ IPADDR=“192.168.220.137”
​ NETMASK=“255.255.255.0”
​ GATEWAY=“192.168.220.2”

image-20221114091309802

​ (4) 配置DSN1,一般都配置成8.8.8.8,如下:

​ DNS1=“8.8.8.8”
​ (5) 编辑/etc/sysconfig/network-scripts/resolv.conf

​ 加入 namespace 8.8.8.8

​ (6) 重启动网络

​ service network restart

2.配置机器

2.1集群要求

  • 一个Master两个worker,按上面方法准备三台机器,并配置好IP

​ master 192.168.79.133

​ worker1 192.168.79.134

​ worker2 192.168.79.135

2.2 3台主机都根据实际情况做如下7大步骤配置

2.1.1 设置主机名

分别在三台机器上执行下面命令

  • master机器

​ hostnamectl set-hostname master

  • worker1

​ hostnamectl set-hostname worker1

  • worker2

​ hostnamectl set-hostname worker2

2.1.2 关闭防火墙

  • systemctl stop firewalld #关闭防火墙
  • [root@master ~]# systemctl disable firewalld #设置开机不启动

2.1.3 禁用selinux

  • [root@master ~]# setenforce 0 #临时关闭selinux
  • [root@master ~]# getenforce #查看selinux状态

​ Permissive

  • [root@master ~]# vim /etc/selinux/config #永久关闭selinux

​ SELINUX=disabled

2.1.4 设置主机名

​ 执行下面命令将主机名写入三台机器

cat>> /etc/hosts <<EOF
192.168.79.133  master
192.168.79.134  worker1
192.168.79.135  worker2
EOF

2.1.5 关闭swap分区(必须,因为k8s官网要求)

[root@master ~]# swapoff -a #禁用所有swap交换分区
[root@master ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 280M 1.2G 9.6M 286M 1.4G
Swap: 0B 0B 0B
[root@master ~]# vim /etc/fstab #永久禁用swap,删除或注释掉/etc/fstab里的swap设备的挂载命令即可
#/dev/mapper/centos-swap swap swap defaults 0 0

2.1.6 时间同步

将所有机器都进行时间同步,以免各结点时钟不一致导致出错

  • systemctl start chronyd
  • systemctl enable chronyd

2.1.7 桥接的IPv4流量

将桥接的IPv4流量传递到iptables的链(有一些ipv4的流量不能走iptables链,因为linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失),配置k8s.conf文件(k8s.conf文件原来不存在,需要自己创建的)

touch /etc/sysctl.d/k8s.conf

cat >> /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF

应用sysctl参数而不重新启动``

sysctl --system

3. 安装K8S

以上6大步骤在每一台虚拟机做完之后,开始安装k8s

3.1 安装docker

在所有节点服务器上都执行,因为k8s默认CRI为docker,cri称之为容器运行时

3.1.1 先删除旧的docker版本

yum remove docker docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

3.1.2 安装并启动Docker

  • 安装yum-utils,主要提供yum-config-manager命令

​ yum install -y yum-utils

  • 下载并安装docker的repo仓库

​ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  • 安装指定版本*

​ yum -y install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io

  • 设置开机自启

​ systemctl enable docker

  • 启动docker*

​ systemctl start docker

3.1.3 设置镜像加速器修改驱动程序

  • 编辑 /etc/docker/daemon.json 加入如下信息

​ ubernetes1.14之后的版本推荐使用systemd,但docker默认的Cgroup Driver 是Cgroup,使得kubelet部署报错*

{  
	"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]  
}
  • 重新启动
  • systemctl daemon-reload
  • systemctl restart docker

3.2 配置kubernetes的阿里云yum源(所有节点执行)

[root@master ~]# cat >/etc/yum.repos.d/kubernetes.repo <<‘EOF’ #在3台虚拟机都配置k8s的yum源
[kubernetes]
name = Kubernetes
baseurl = https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled = 1
gpgcheck = 0
repo_gpgcheck = 0
gpgkey = https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

3.3 yum安装kubeadm、kubelet、kubectl(所有节点都执行)

#在3台虚拟机上都执行安装kubeadm、kubelet、kubectl(kubeadm和kubectl都是工具,kubelet才是系统服务)
[root@master ~]# yum list --showduplicates | grep kubeadm #查看yum可获取的kubeadm版本,这里安装1.22.6版本,不指定版本的话默认安装最新版本
[root@master ~]# yum -y install kubelet-1.22.6 kubeadm-1.22.6 kubectl-1.22.6 #安装kubeadm、kubelet、kubectl
[root@master ~]# systemctl enable kubelet #设置kubelet开机自启(先不用启动,也起不了,后面kubeadm init初始化master时会自动拉起kubelet)

3.4 初始化master节点

  • 在master结点执行下面命令
kubeadm init \
--apiserver-advertise-address=192.168.79.133 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.6 \
--service-cidr=10.96.0.0/12  \
--pod-network-cidr=10.244.0.0/16

初始化成功后会有相应信息

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 ( i d − u ) : (id -u): (idu):(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.79.133:6443 --token 4satw3.taacrwve713g85dy
–discovery-token-ca-cert-hash sha256:933006fe019532c205740ce47d2d7fcadaa323a264811066c8b1374e281fbbf8

  • 根据输入的提示信息复制粘贴照着做即可:

[root@master ~]# mkdir -p $HOME/.kube #复制照着做即可

[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config #复制照着做即可

[root@master ~]# sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config #复制照着做即可

[root@master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf #复制照着做即可

3.5 将node节点加入k8s集群

  • 在另外两台机器上执行

​ kubeadm join 192.168.79.133:6443 --token 4satw3.taacrwve713g85dy
​ --discovery-token-ca-cert-hash sha256:933006fe019532c205740ce47d2d7fcadaa323a264811066c8b1374e281fbbf8

4. 部署容器网络,CNI网络插件(在Master上执行)

4.1 在master节点配置pod网络创建

​ node节点加入k8s集群后,在master上执行kubectl get nodes发现状态是NotReady,因为还没有部署CNI网络插件,其实在步骤四初始化
​ 完成master节点的时候k8s已经叫我们去配置pod网络了。在k8s系统上Pod网络的实现依赖于第三方插件进行,这类插件有近数十种之多,较为
​ 著名的有flannel、calico、canal和kube-router等,简单易用的实现是为CoreOS提供的flannel项目。

​ 执行下面这条命令在线配置pod网络,因为是国外网站,所以可能报错,测试去http://ip.tool.chinaz.com/网站查到
​ 域名raw.githubusercontent.com对应的IP,把域名解析配置到/etc/hosts文件,然后执行在线配置pod网络,多尝试几次即可成功。

4. 2 下载kube-flannel.yml

​ wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

​ 找到如下位置,修改Newwork 与执行kubeadm init 一致。

net-conf.json: |
{
“Network”: “10.244.0.0/16”,
“Backend”: {
“Type”: “vxlan”
}
}

4.3 执行如下命令安装flannel 插件

4.3.1拉取镜像

  • 可以先拉取镜像然后再执行安装命令

    虽然执行安装命令时会自动去拉取镜像,但如果镜像无法拉取,执行安装命令也会失败。镜像拉取到本地后安装时可以直接使用本地镜像。

​ docker pull rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0
​ docker pull rancher/mirrored-flannelcni-flannel:v0.20.1

4.3.2 执行命令

  • kubectl apply -f kube-flannel.yml

4.4 测试k8s集群

4.4.1 制做Docker 镜像打包

  • 新建文件夹 hello_kube,进入该文件夹,新建文件:

  • 创建server.js 文件

var http = require('http');
console.log('Heeeee');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);
console.log('Listening') 
  • 创建Dockerfile 文件
FROM node:6.14.2
EXPOSE 8080
COPY server.js .
CMD node server.js  
  • 创建镜像
    • 接着在hello_kube文件夹,执行命令:docker build -t hello_world:v2 .
    • 注意命令中最的的点不要漏掉。

4.4.2 部署创建的镜像

  • 创建部署文件 hello_world.yaml
apiVersion: v1
kind: Service
metadata:
 name: hello-world
spec:
 type: NodePort
 ports:
 - port: 80
   targetPort: 8080
   nodePort: 31611
 selector:
  app: hello-world
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: hello-world
spec:
 replicas: 3
 selector:
  matchLabels:
   app: hello-world
 template:
  metadata:
   labels:
    app: hello-world
  spec:
   containers:
   - name: hello-world
     image: hello_world:v2
     ports:
     - containerPort: 8080
  • 执行命令进行部署:kubectl apply -f hello_world.yaml
  • 镜像名为:hello_world:v2

4.4.3 查看部署结果

  • 执行命令查看服务:kubectl get svc -owide

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
    hello-world NodePort 10.98.7.230 80:31611/TCP 3d21h app=hello-world
    kubernetes ClusterIP 10.96.0.1 443/TCP 3d22h

  • crul 10.98.7.230(或curl 10.98.7.230:80)

    显示Hello World!则表明部署成功

5. 机器重启后k8s异常的解决

  • 重启动Docker(主从结点都执行)

    systemctl restart docker

  • 重启动kubelet(主从结点都执行)

    systemctl restart kubelet

  • 查看容器启动情况(主从结点都执行)

    docker ps -a

  • docker start $(docker ps -a | awk ‘{ print $1}’ | tail -n +2) # 部分组件有依赖性,执行后部分组件未启动,可重复执行该命令

  • 查看端口是否启动

    ss -utnlp | grep 6443

    显示这类信息表示已经启动:tcp LISTEN 0 128 [::]:6443 [::]😗 users:((“kube-apiserver”,pid=12905,fd=7))

  • 查看相关组件是否正常执行

    kubectl get pods -n kube-system

    显示如下信息表示已经正常

    coredns-7f6cbbb7b8-9dh27 1/1 Running 1 (15m ago) 3d22h
    coredns-7f6cbbb7b8-t4kn6 1/1 Running 1 (15m ago) 3d22h
    etcd-master 1/1 Running 2 (2m57s ago) 3d22h
    kube-apiserver-master 1/1 Running 2 (2m52s ago) 3d22h
    kube-controller-manager-master 1/1 Running 4 (2m58s ago) 3d22h
    kube-proxy-ntk5w 1/1 Running 1 (15m ago) 3d22h
    kube-proxy-pmh98 1/1 Running 2 (2m58s ago) 3d22h
    kube-proxy-wjths 1/1 Running 1 (15m ago) 3d22h
    kube-scheduler-master 1/1 Running 4 (2m58s ago) 3d22h

  • 查看你dashboard是否正常执行,未安装可不执行

    kubectl get pods -n kubernetes-dashboard

6.其它

  • 设置角色

​ kubectl label node worker1 node-role.kubernetes.io/worker=worker

  • 强制删除pod

​ kubectl delete pod -n --force --grace-period=0

  • 单节点集群问题

    • 当创建单机版的 k8s 时,这个时候 master 节点是默认不允许调度 pod

    • 解决:执行命令将 master 标记为可调度即可 ,即删除污点

      kubectl taint nodes --all node-role.kubernetes.io/master-
      
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐