Centos7搭建Kubernetes单master的集群

版本说明

Kubernetes版本是 1.18.0

Docker版本是 docker-ce-19.03.12

前置工作

关闭 selinux

三台机器都关闭

两种方式:

方式1 永久的:

 sed -i 's/enforcing/disabled/' /etc/selinux/config

方式2 临时关闭

setenforce 0 # 临时

关闭 swap

三台机器都关闭

永久关闭

echo "vm.swappiness = 0">> /etc/sysctl.conf 

关闭防火墙

三台机器都关闭

将桥接的 IPv4 流量传递到 iptables 的链

三台机器都设置

直接复制到shell终端敲回车就行了

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

三台机器执行,让三台机器都生效,直接复制到shell终端敲回车就行了

sysctl --system 

时间同步,让三台机器的时间都相同

配置docker

K8s依赖Docker

三台机器安装docker

建议三台机器的docker版本是一样的.

安装完了并且设置开机启动

我安装的docker版本是docker-ce-19.03.12

https://www.yuque.com/docs/share/407895ea-3456-4895-bdee-ec16df344a09?# 《centos7 安装指定版本的docker》

docker仓库配置阿里云镜像

因为网速快,不然的话,下载image会很慢,

三台机器都运行一下

cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

改完以后需要重启所有docker才能让配置生效

重启命令:

 systemctl restart docker

添加阿里云yum软件源

因为后面要下载东西,如果不添加的话,那么就会连到国外网站,可能就会出现下载网速很慢,甚至连不上国外网络.

三台机器都粘到linux终端运行一下

 cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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

查看是否设置成功

命令:

docker info

结果:

如果 Registry Mirrors是aliyuncs 说明设置成功了.

[root@zjj103 ~]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.12
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc version: ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-957.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 2.728GiB
 Name: zjj103
 ID: AA4E:2ANN:6QOU:PPLO:MOJQ:JGPP:27GU:SA2Q:BFIZ:5OER:4VSZ:W3FO
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
  
 Registry Mirrors:
  https://b9pmyelo.mirror.aliyuncs.com/
 Live Restore Enabled: false

开始安装K8s

安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署,

如果你不指定版本号的话,那么安装的就是最新的版本.

在三个节点都安装一遍

 yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
 

设置开机启动

 systemctl enable kubelet

部署Kubernetes Master

在master节点执行,不要在node节点执行

注意: 172.16.10.101 是当前master节点的ip

 kubeadm init --apiserver-advertise-address=172.16.10.101   --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.18.0   --service-cidr=10.96.0.0/12   --pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。

  • 配置说明:

apiserver-advertise-address是当前节点的jp

image-repository 是镜像地址

kubernetes-version k8s版本

service-cidr 和 pod-network-cidr 是自己连接访问的ip,没什么特别的要求,只要和当前系统不冲突就行了.

  • 这个命令做的事情

    ​ 你master节点要做很多的事情,比如说api server controller manager 镜像组件的下载和部署

    能看到这个命令帮你拉取了很多K8s相关的镜像

[root@zjj101 ~]# docker images
REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
registry.aliyuncs.com/google_containers/kube-proxy                v1.18.0             43940c34f24f        11 months ago       117MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.18.0             74060cea7f70        11 months ago       173MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.18.0             d3e55153f52f        11 months ago       162MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.18.0             a31f78c7c8ce        11 months ago       95.3MB
registry.aliyuncs.com/google_containers/pause                     3.2                 80d28bedfe5d        12 months ago       683kB
registry.aliyuncs.com/google_containers/coredns                   1.6.7               67da37a9a360        13 months ago       43.8MB
registry.aliyuncs.com/google_containers/etcd                      3.4.3-0             303ce5db0e90        16 months ago       288MB

使用kubectl工具 :

Centos7搭建Kubernetes单master的集群

下面的这个不见得和上面控制台的一样,建议核对一下

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看有哪些节点

 kubectl get nodes

5. 加入Kubernetes Node

上面在node节点执行的命令执行完了之后,

​ 如果没执行,忘了token了就使用下面的方法重新生成token.

在Master节点输入命令

kubeadm token create --print-join-command

查看控制台的内容,找到类似下面的命令,这个就是token,token默认的有效期是24小时,过期之后token就不能用了.就需要重新创建token

 kubeadm join 192.168.1.11:6443 --token esce21.q6hetwm8si29qxwn \
    --discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5

把这个命令复制到node节点去执行,注意Master节点不需要去执行,node节点执行就行了.

检查K8s集群

在Master节点用 kubectl get nodes 命令检查,就能发现有一个Master和两个node节点了.

[root@zjj101 ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE    VERSION
zjj101   NotReady   master   6h8m   v1.18.0
zjj102   NotReady   <none>   7s     v1.18.0
zjj103   NotReady   <none>   11m    v1.18.0

发现status都是NotReady状态,因为现在网络还不能访问,需要一个网络插件.

6. 部署CNI网络插件

默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。

在Master节点先执行:

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

再执行,此时可能网络会有点慢,可能会失败,多尝试几次,如果实在不行就找个kube-flannel.yml尝试本地设置进去. kubectl apply kube-flannel.yml 读取本地文件,好像是可以读取的,等有这个场景的时候我去试试.

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml


### 检查是否都启动成功

kubectl get pods -n kube-system 命令

都是Running状态就是执行成功了

[root@zjj101 ~]# kubectl get pods -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-7ff77c879f-mfjmg         1/1     Running   0          5m52s
coredns-7ff77c879f-t8fdg         1/1     Running   0          5m52s
etcd-zjj101                      1/1     Running   0          6m3s
kube-apiserver-zjj101            1/1     Running   0          6m3s
kube-controller-manager-zjj101   1/1     Running   0          6m3s
kube-flannel-ds-7stq4            1/1     Running   0          105s
kube-flannel-ds-lpbrp            1/1     Running   0          105s
kube-flannel-ds-rsttx            1/1     Running   0          105s
kube-proxy-chmpw                 1/1     Running   0          4m39s
kube-proxy-cvz8v                 1/1     Running   0          4m46s
kube-proxy-pq44r                 1/1     Running   0          5m52s
kube-scheduler-zjj101            1/1     Running   0          6m3s

查看一下Nodes

kubectl get nodes 命令

[root@zjj101 ~]#  kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
zjj101   Ready    master   7m34s   v1.18.0
zjj102   Ready    <none>   6m7s    v1.18.0
zjj103   Ready    <none>   6m1s    v1.18.0

发现status都是ready 就说明启动成功了

7. 测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

# 拉取nginx 的pod
[root@zjj101 ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
# 查看pod ,发现了一个nginx,等status状态变成running状态后就可以了
[root@zjj101 ~]#  kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
nginx-f89759699-rh5lk   1/1     Running   0          2m19s

对外暴露端口,如果你不暴露的话,外网是访问不了的. nginx默认的端口是80

命令: kubectl expose deployment nginx --port=80 --type=NodePort

[root@zjj101 ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

查看对外的端口: kubectl get pod,svc

[root@zjj101 ~]# kubectl get pod,svc
NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-f89759699-rh5lk   1/1     Running   0          5m10s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        15m
service/nginx        NodePort    10.98.67.59   <none>        80:31715/TCP   46s

发现nginx对外暴露的端口是31715

打开浏览器测试一下

zjj101 zjj102 zjj103 是我在windows本机做host映射了, 实际上zjj101 是master机器 , zjj102是node1机器 , zjj103是 node2机器.

http://zjj101:31715/

http://zjj102:31715/

http://zjj103:31715/

Centos7搭建Kubernetes单master的集群

上一篇:kubernetes和docker----2.学习Pod资源


下一篇:Mysql主从同步时Slave_IO_Running:Connecting ; Slave_SQL_Running:Yes的情况故障排除