K8s安装与配置记录


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

这个配置文件集合了 DeploymentService 的配置,一些配置项说明如下:

  • 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的端口都是一样的,通过:NodePort的方式Kubernetes集群外部的程序可以访问Service。
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.

参考文章

k8s的安装

使用


文章作者: LANVNAL
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LANVNAL !
  目录