部署目标

  • 在所有节点上安装Docker和kubeadm
  • 部署Kubernetes Master
  • 部署容器网络插件flannel,让node找到master

一主二从 配置三个虚拟机

ip 域名 备注 安装软件
192.168.12.111 master 主节点 Docker Kubeadm kubelet kubectl flannel
192.168.12.112 node1 从节点 1 Docker Kubeadm kubelet kubectl
192.168.12.113 node2 从节点 2 Docker Kubeadm kubelet kubectl

基本环境

装与配置环境

  1. yum install -y wget nettools vim bashcomp*

安装docker

添加软件源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum下载

yum install -y docker-ce docker-ce-cli containerd.io

然后配置docker镜像加速

mkdir /etc/docker

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

编辑vim /usr/lib/systemd/system/docker.service
修改一行

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

然后重启docker

systemctl daemon-reload
systemctl enable docker
systemctl restart docker

安装k8s

配置kubernetes yum源

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
EOF

如果有先卸载旧版本

yum remove -y kubelet kubeadm kubectl

安装

yum install -y kubelet.x86_64 kubeadm.x86_64 kubectl.x86_64

直接安装会安装最新版本,可能阿里云镜像仓库没有对应镜像,指定1.19.2版本安装

 yum install -y kubelet-1.19.2 kubeadm-1.19.2 kubectl-1.19.2

启动

systemctl enable kubelet && systemctl start kubelet

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

image.png

# 如果cat /proc/sys/net/bridge/bridge-nf-call-iptables可以看到1就不设置了
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
# 修改配置
vi /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

关闭操作

关闭 防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭 SeLinux

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

关闭 swap

swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

Master节点配置

设置主机名

hostnamectl set-hostname master

改hosts文件

vim /etc/hosts

192.168.12.111 master
192.168.12.112 node1
192.168.12.113 node2

通过kueadm配置

先看一下kueadm版本

 kubeadm version

image.png
在kubeadm init命令之前执行此命令拉取镜像

kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers

配置版本与kubeadm版本对应 master节点ip 镜像仓库 内网网段

kubeadm init --kubernetes-version=1.19.2 \
--apiserver-advertise-address=192.168.12.111 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

显示初始化成功
image.png
最后面的添加node节点的命令需要记下来,不记下的话就需要刷新token

kubeadm join 192.168.12.111:6443 --token yefif0.fmnr9bkbs502h8cs \
    --discovery-token-ca-cert-hash sha256:28c024c515a0ab092491ea277b7c61dd775042bd949850453c9df9312c3b9b93

然后根据他提示的命令来创建.kube配置

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

安装flannel网络插件

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

但是这个网址被墙了,需要下载下来kube-flannel.yml 然后执行

kubectl apply -f kube-flannel.yml

安装完之后查看部署状态

kubectl get po -n kube-system

网络插件 flannel coredns都已经启动成功了 这时候k8s就已经跑起来了
image.png
如果出现node master not found 错误
检查权限

chmod 777 /run/flannel/subnet.env

如果fannel pod启动失败

kubectl describe pod kube-flannel-ds-hd6lf -n kube-system

如果镜像拉取失败,可尝试修改quay.io的镜像路径,可以执行,会打印yaml的内容

kubectl get pod kube-flannel-ds-hd6lf -n kube-system -o yaml

或者下载下来

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

并将结果保存至flannel.yaml

kubectl delete -f flannel.yaml
kubectl create -f flannel.yaml

查看master节点已经启动成功

kubectl get node

image.png
如果玩坏了 就使用重置命令 从init命令开始重来

kubeadm reset

node节点配置

加入集群

首先按照上面写的安装好docker k8s
也要设置好主机名
加入集群最简单的是直接使用上面init时生成的命令来加入

如果是把master节点虚拟机克隆了就需要先执行 kubeadm reset, 把master的网络环境清理一下

kubeadm join 192.168.12.111:6443 --token yefif0.fmnr9bkbs502h8cs \
    --discovery-token-ca-cert-hash sha256:28c024c515a0ab092491ea277b7c61dd775042bd949850453c9df9312c3b9b93

默认token的有效期为24小时,当过期之后,该token就不可用了。解决方法如下:
重新生成新的token,在master端执行 —ttl 0表示永久token

kubeadm token create --ttl 0 --print-join-command

测试结果,然后直接拿生成的join命令拿来用就行了

[root@localhost .kube]# kubeadm token create --ttl 0 --print-join-command
W0413 10:52:55.147991   52527 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join 192.168.12.111:6443 --token l1spf7.72sy5atbdt18dbzo \
--discovery-token-ca-cert-hash sha256:28c024c515a0ab092491ea277b7c61dd775042bd949850453c9df9312c3b9b93

将 master 节点的 admin.conf 拷贝到 node1,这个操作是为了能在node节点使用kubectl命令

scp /etc/kubernetes/admin.conf root@node1:/etc/kubernetes/

配置 Kubeconfig 环境变量

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

节点退出并重进

在master上运行
image.png
删除节点

kubectl delete node node1

然后回到node1服务器运行命令
停用kubelet

systemctl stop kubelet

删除之前的相关文件

rm -rf /etc/kubernetes/*

然后再用上面的join命令
如果join命令有误 就先reset

kubeadm reset

测试集群是否构建成功

创建一个nginx的容器测试

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

最后一个命令可以查看到对外暴露的端口image.png
使用node2的ip访问一下 http://192.168.12.112:32082/
能看到nginx的首页表示成功了

安装dashboard

通过yaml安装
kubernetes-dashboard.yaml
指定当前路径kubernetes-dashboard.yaml文件 要指定好路径

kubectl create -f kubernetes-dashboard.yaml

使用wget获取原生的yaml文件

wget -O kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml

修改的地方是
指定nodeport 和对外暴露端口
image.png
以及所有的镜像地址 为了避免无法访问 可以改一下
image.png
创建好了之后查看状态

kubectl get pod,svc -n kubernetes-dashboard

image.png
可以通过node ip和31111端口访问 以https方式访问
https://192.168.12.112:31111/
会被登录拦截需要使用token 登录

获取token

kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token

image.png