版本说明
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工具 :
下面的这个不见得和上面控制台的一样,建议核对一下
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/