部署目标
- 在所有节点上安装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 |
基本环境
装与配置环境
yum install -y wget net‐tools vim bash‐comp*
安装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的链
# 如果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
在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
显示初始化成功
最后面的添加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就已经跑起来了
如果出现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
如果玩坏了 就使用重置命令 从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上运行
删除节点
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
最后一个命令可以查看到对外暴露的端口
使用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 和对外暴露端口
以及所有的镜像地址 为了避免无法访问 可以改一下
创建好了之后查看状态
kubectl get pod,svc -n kubernetes-dashboard
可以通过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