K8s 安装
因为k8s 1.20版本后就使用 containerd 来代替 docker ,因为我还有docker的需求,所以安装的1.19.5版本
环境
机器配置:
Master: 4核8G(1台)
node:2核4G(2台)
规划:
172.22.107.224 test-master
172.22.107.161 test-node1
172.22.107.129 test-node2
关闭防火墙、关闭selinux、关闭swap。三台机器都需要执行
# 关闭防火墙
systemctl disable firewalld
# 暂时关闭,不用重启,
setenforce 0
# 永久关闭,需要重启机器,。所以2个操作一起做
vim /etc/selinux/config #将SELINUX=enforcing改为SELINUX=disabled
# 临时关闭swap
swapoff -a
# 永久关闭swap分区,2个操作一起做
sed -ri 's/.*swap.*/#&/' /etc/fstab
修改为规划中的hostname名;修改hosts文件。三台机器都需要执行
# 查看主机名hostname
hostname
# CentOS7修改主机名hostname的方法为hostnamectl set-hostname NEW_NAME
# 三台机器分别master,node1,node2
hostnamectl set-hostname master
# 追加hosts文件,ip为用户自己的电脑的ip。三台机器都需要执行
hostnamectl status
echo "127.0.0.1 $(hostname)" >> /etc/hosts
172.22.107.224 test-master
172.22.107.161 test-node1
172.22.107.129 test-node2
同步时间。三台机器均执行
yum install ntpdate -y
ntpdate time7.aliyun.com
设置内核,打开转发。三台机器均执行
vim /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
开始安装
镜像换源(3台都执行):
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
安装docker和kubelet (3台)
快速安装
curl -sSL https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.5
初始化 master 节点(只在master执行)
关于初始化时用到的环境变量
APISERVER_NAME 不能是 master 的 hostname
APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号
POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改
快速安装
# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=172.22.107.224
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.test
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.5
检查 master 初始化结果
# 只在 master 节点执行
# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
# 查看 master 节点初始化结果
kubectl get nodes -o wide
初始化 worker节点
初始化 worker节点(在 master 节点上执行)
# 只在 master 节点执行
kubeadm token create --print-join-command
eg:
[root@test-master ~]# kubeadm token create --print-join-command
W1223 03:44:05.715635 24434 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join apiserver.test:6443 --token fqx4lw.yl1qzkgcg46vxe85 --discovery-token-ca-cert-hash sha256:b829467c928ee38a45e268e98fb8f0ed1c0110e360d7de8da5ce6d595757a508
有效时间
该 token 的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点。
初始化worker(针对所有的 worker 节点执行)
# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=172.22.107.224
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.test
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.test:6443 --token fqx4lw.yl1qzkgcg46vxe85 --discovery-token-ca-cert-hash sha256:b829467c928ee38a45e268e98fb8f0ed1c0110e360d7de8da5ce6d595757a508
检查初始化结果(在 master 节点上执行)
# 只在 master 节点执行
kubectl get nodes -o wide
输出结果如下所示:
[root@test-master ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
test-master Ready master 30m v1.19.5 172.22.107.224 <none> CentOS Linux 7 (Core) 3.10.0-1127.el7.x86_64 docker://19.3.11
test-node1 Ready <none> 85s v1.19.5 172.22.107.161 <none> CentOS Linux 7 (Core) 3.10.0-1127.el7.x86_64 docker://19.3.11
test-node2 Ready <none> 73s v1.19.5 172.22.107.129 <none> CentOS Linux 7 (Core) 3.10.0-1127.el7.x86_64 docker://19.3.11
测试
使用这个nginx的yaml文件
nginx-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
这个配置文件集合了 Deployment
和 Service
的配置,一些配置项说明如下:
- spec.template: 指定要部署的 Pod
- spec.replicas: 指定要部署的个数
- spec.selector: 定位需要管理的 Pod
- spec.selector: 指定如何选择 Pod
- spec.ports: 指定如何暴露端口
- spec.type: Service类型,有三种类型ClusterIP、NodePort和LoadBalancer,ClusterIP的话只提供一个集群内部的虚拟IP,外部无法ip访问
1.ClusterIP:提供一个集群内部的虚拟IP(与Pod不在同一网段),以供集群内部的pod之间通信使用。
2.NodePort:在每个Node上打开一个随机端口并且每个Node的端口都是一样的,通过
3.LoadBalancer:利用Cloud Provider特有的Load Balancer对外提供服务,Cloud Provider负责将Load Balancer的流量导向Service
写好配置文件,通过 kubectl apply -f nginx.yaml
启动
通过如下指令查看进度:
## 查看pod
[root@test-master ~]# kubectl get pods -o wide -l 'app=nginx'
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-7fb7fd49b4-mm7rl 1/1 Running 0 71m 10.100.117.3 test-node2 <none> <none>
nginx-deployment-7fb7fd49b4-tsv8p 1/1 Running 0 71m 10.100.65.131 test-node1 <none> <none>
## 查看deployment
[root@test-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 72m
可以通过 kubectl 获取服务信息,找到为你的服务创建的 IP 地址:
kubectl describe services nginx-service
或者
这个端口就是master机器暴露的端口,使用master的ip加端口就可以外部访问部署的应用
怎么删除pods和deployment
1、先删除pod
2、再删除对应的deployment
否则只是删除pod是不管用的,还会看到pod,因为deployment.yaml文件中定义了副本数量
## 查看pod和deployment
[root@test-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7fb7fd49b4-mm7rl 1/1 Running 0 78m
nginx-deployment-7fb7fd49b4-tsv8p 1/1 Running 0 78m
[root@test-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 78m
## 删除pod
[root@test-master ~]# kubectl delete pod nginx-deployment-7fb7fd49b4-mm7rl
pod "nginx-deployment-7fb7fd49b4-mm7rl" deleted
[root@test-master ~]# kubectl delete pod nginx-deployment-7fb7fd49b4-tsv8p
pod "nginx-deployment-7fb7fd49b4-tsv8p" deleted
## 查看pod仍然存储
[root@test-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7fb7fd49b4-8gxqj 1/1 Running 0 39s
nginx-deployment-7fb7fd49b4-fgxml 1/1 Running 0 51s
## 删除deployment
[root@test-master ~]# kubectl delete deployment nginx-deployment
deployment.apps "nginx-deployment" deleted
## 再次查看pod消失
[root@test-master ~]# kubectl get pods
No resources found in default namespace.
[root@test-master ~]# kubectl get deployment
No resources found in default namespace.