1.VMware安装CentOS7.9
1.1CPU 4核 内存 4G 磁盘100G
1.2 改IP为静态地址
1.2.1查看IP
-
ip addr
ens33为动态分配的IP ,一会将其设为静态地址
1.2.2进入配置文件目录
- cd /etc/sysconfig/network-scripts/
-
编辑配置文件
vim ifcfg-ens33
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4e0a4d571878b8fdd32a62a20b5933df.png)
(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”
(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.2.1 设置主机名
分别在三台机器上执行下面命令
- master机器
hostnamectl set-hostname master
- worker1
hostnamectl set-hostname worker1
- worker2
hostnamectl set-hostname worker2
2.2.2 关闭防火墙
- systemctl stop firewalld #关闭防火墙
- [root@master ~]# systemctl disable firewalld #设置开机不启动
2.2.3 禁用selinux
- [root@master ~]# setenforce 0 #临时关闭selinux
- [root@master ~]# getenforce #查看selinux状态
Permissive
- [root@master ~]# vim /etc/selinux/config #永久关闭selinux
SELINUX=disabled
2.2.4 设置主机名
执行下面命令将主机名写入三台机器
cat>> /etc/hosts <<EOF
192.168.79.133 master
192.168.79.134 worker1
192.168.79.135 worker2
EOF
2.2.5 关闭swap分区
[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.2.6 时间同步
将所有机器都进行时间同步,以免各结点时钟不一致导致出错
- systemctl start chronyd
- systemctl enable chronyd
2.2.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):
(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.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): (id−u):(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-
-