0、步骤总览
- 虚拟机集群,网络设置,能相互ping通,都能访问外网。关闭防火墙、swap、selinux,统一时间
- 安装Docker,安装Kubernetes组件:kubectl+kubeadm+kubelet。
- 安装registry私库,在master上进行,能正常pull/push;安装registry-web便于查看
- 安装kube 主节点(master),kubeadm init… 安装flannel网络插件 get pod 查看运行状态均为running
- 安装kube 子节点(slave),kubeadm join… 加入主节点,get node 查看正常加入状态为ready
- 安装dashboard
- 部署Java服务:制作镜像+使用Dockerfile上传+使用app.yaml部署
- 问题记录:部署过程中遇到的问题,不一定必现
主节点需要执行:1、2、3、5、6
子节点需要执行:1、2、4
1、虚拟机集群
我使用的是 vm15 Pro(15.0.0) + Centos7
进行集群搭建时记得编辑虚拟机设置:将usb、打印机、声卡删除,只保留以下几项,避免启动时电脑蓝屏
具体集群安装过程参考:虚拟机VMware配置centos7集群,个人感觉这是目前看到十分详细的讲解。
不过在安装过程中还是遇到了一点点问题,在执行 ping baidu.com 的时候不成功,相互之间也 ping 不成功。我的解决步骤:虚拟机无法ping通本机ip和www.baidu.com问题
这里建议将主节点master的处理器和内存调高些(如3G+8核),主节点上后面运行的程序会比较多,避免不必要的问题出现。
再确认一遍**每个虚拟机的防火墙一定要关!**附上防火墙(firewall)的使用命令
查看已开放端口:firewall-cmd --list-all #ports对应
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld
假设大家搭建好后的集群信息为:(hostname 不能包含 - _ 字符,不然后面安装k8s会报错)
192.168.126.100 master
192.168.126.110 slave1
192.168.126.120 slave2
需要以下三种情况都能正常ping通:
本机 ping 虚机ip(master/slave1/slave2)
虚机 ping 本机ip
虚机 ping baidu.com
可能这步有的小伙伴会卡壳,不要心急,准备就绪后开始整活!
2、安装Docker+Kubernetes组件
虚机集群正常工作后,开始安装Docker和Kubernets,这里可以先把所有子节点删除,安装完后再进行拷贝生成子节点,避免重复安装。
开启 bridge-nf,修改vim /etc/sysctl.conf
,末尾添加如下配置,执行命令 sysctl --system
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
安装Docker:
wget -P /etc/yum.repos.d/ https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl start docker
systemctl enable docker
修改docker镜像源:vim /etc/docker/daemon.json
insecure-registries表示registry私库地址,这里先配好
{
"registry-mirrors": ["https://registry.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.126.200:5000"]
}
systemctl daemon-reload #重载docker配置
systemctl restart docker #重启docker服务
安装Kubernetes组件:
选择阿里云的yum源,直接拷贝下面代码执行,完了进行安装
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes
systemctl start kubelet
systemctl enable kubelet
拷贝生成子节点,挨个对子节点进行修改
vim /etc/sysconfig/network-scripts/ifcfg-ens32 #修改IPADDR,非主机删除 UUID
vim /etc/sysconfig/network #修改HOSTNAME
hostnamectl set-hostname slave1 #设置主机名
service network restart
3、安装registry私库
master节点上安装registry私库:
提前先在master上安装registry私库,后面安装kube master节点的时候会用到。
下载最新registry镜像:docker pull registry
启动并且挂载镜像仓库到本地磁盘:docker run -d -v /registry:/home/docker-registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest
-v /registry:/home/docker-registry:默认情况下,会将仓库存放于容器内的/home/docker-registry目录下,指定本地目录挂载到容器。
-p 5000:5000 :端口映射。即本地5000端口,映射到registry中的5000端口。
--restart=always:在容器退出时总是重启容器,主要应用在生产环境。
--privileged=true:在CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报类似权限错误。OSError: [Errno 13] Permission denied: ‘/tmp/registry/repositories/liibrary’)或者(Received unexpected HTTP status: 500 Internal Server Error)
--name registry:指定容器的名称。
下载所需镜像:https://pan.baidu.com/s/1YJ881k6Zoly8FXSKdc_lvQ / d0mz
挨个将镜像导入:docker load -i flannel.tar
导入完成后,需要将镜像上传到registry,这里需要对每个镜像重新打标签:docker tag 192.168.126.150:5000/google_containers/flannel:v0.11.0-amd64 192.168.126.100:5000/google_containers/flannel:v0.11.0-amd64
然后将google_containers下的镜像挨个上传到registry: docker push 192.168.126.200:5000/google_containers/flannel:v0.11.0-amd64
上传完后安装docker-registry-web:
docker pull hyper/docker-registry-web
docker run -d -p 5001:8080 --name registry-web --restart=always --link registry -e REGISTRY_URL=http://192.168.126.100:5000/v2 -e REGISTRY_NAME=192.168.126.100:5000 hyper/docker-registry-web
docker run ##运行
-d ##后台运行
-p 5001:8080 ##端口映射
--name registry-web ##容器命名
--restart ##重启docker时,registry跟随自启
--link registry ##连接其他容器 加入registry到host
-e REGISTRY_URL=http://192.168.126.100:5000/v2 ##指定仓库地址
-e REGISTRY_NAME=192.168.126.100:5000 ##仓库命名
hyper/docker-registry-web ##被启动的镜像
访问:http://192.168.126.100:5001/
到这里Docker私库安装完毕,下面开始安装kube!
4、安装kube 主节点
echo 1 > /proc/sys/net/ipv4/ip_forward
kubeadm init --kubernetes-version=v1.21.0 --pod-network-cidr=10.244.0.0/16 --image-repository 192.168.126.200:5000/google_containers --apiserver-advertise-address 192.168.126.200 --v=6
– apiserver-advertise-address 这里务必使用master的ip,等待一段时间后,可以得到安装完成的界面:
后面的执行顺序在上面执行完后的日志中可以看到,继续进行:
如果是root用户,执行:
export KUBECONFIG=/etc/kubernetes/admin.conf
如果是普通用户,执行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
记住kubeadm join 192.168.126.200:6443 --token 7q…,子节点加入集群时使用该命令。
kubeadm join 192.168.126.200:6443 --token 7qdak6.qdhu0tluso01t63w --discovery-token-ca-cert-hash sha256:ffe1567f513033eae232f40e1b342d71c60b2d993685664f0f0b678bd07623b8
token有效期默认是24小时,如果忘记了,可以使用如下命令再生成一个:kubeadm token create --print-join-command
上节中的export命令重启后需要重新执行,所以我们可以把它写入到.bash_profile中:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
执行 kubectl get cs
查看组件及状态,发现scheduler和controller-manager的状态为Unhealthy,一般是因为kube-scheduler和kube-controller-manager组件配置默认禁用了非安全端口,分别找到以下两个文件的- --port=0
,将其注释掉:
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
然后执行systemctl restart kubelet
重启kubelet,查看状态,已经正常:
接下来安装Flannel网络插件,在前面百度云下载的资源中找到 k8s-yaml/kube-flannel.yml,拷贝到root目录下,这里会下载flannel镜像,确保kube-flannel.yml中image的地址为registry私库中镜像的地址。
执行命令:kubectl apply -f kube-flannel.yml
查看当前所有pod:kubectl get pods -o wide --all-namespaces
查看容器启动情况:kubectl describe pods kube-flannel-ds-gkkwk -n kube-system
5、安装kube 子节点
主节点上获取加入命令 kubeadm token create --print-join-command
,子节点执行命令加入主节点:
kubeadm join 192.168.126.200:6443 --token sykodz.gdrpvq8no868eu3o --discovery-token-ca-cert-hash sha256:ffe1567f513033eae232f40e1b342d71c60b2d993685664f0f0b678bd07623b8
执行命令kubectl get nodes
查看node状态,全部Ready正常状态:
执行kubectl get pods -o wide --all-namespaces
,查看pods,如果子节点的kube-flannel状态为Init:0/1,重启docker和kubelet服务:systemctl restart docker && systemctl restart kubelet
,再看全部Running正常状态:
到这里可以很负责任地告诉大家,k8s已经部署成功啦!!稍稍放松放松,后面开始部署dashboard,k8s的可视化界面。
6、安装dashboard
主节点打标签:kubectl label nodes master master=master
在前面百度云下载的资源中找到 k8s-yaml/dashboard.yaml,上传到root目录下,安装dashboard命令:kubectl apply -f dashboard.yaml
安装完成之后,我们查看一下我们的pod节点是否已经启动,执行kubectl get pod -o wide -A
,Running说明已经安装完成了:
获取token,执行命令:kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
访问:https://192.168.120.200:30000,输入token,登录
修改登录 Token 的有效时长,登录dashboard,点击编辑
在这儿插入 - '--token-ttl=43200'
其中43200以秒为单位,点击更新
7、部署Java服务
接下来我们部署一个SpringBoot的Java服务。我的做法是先打成jar包,然后根据Dockerfile生成镜像上传到registry私库,然后部署服务
生成镜像上传私库:https://gitee.com/FantZero/JavaDemo/tree/master/springboot-docker-upload
找到k8s-yaml/springboot-application.yaml,修改image地址为上传镜像到私库后的地址,执行 kubectl apply -f springboot-application.yml
更多操作可参考:https://www.jb51.net/article/190338.htm
部署Java服务报错整理:
-
运行 Dockerfile 时不能拉取 java 镜像
Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: no such host
vi /etc/resolv.conf
添加 nameserver 8.8.8.8 -
运行 Springboot 项目编译版本 52 required but 54 given
修改 pom.xml 文件的 ,改为8 -
docker run … 发现容器刚启动就退出了
-
报错WARNING: IPv4 forwarding is disabled. Networking will not work.
echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.confsystemctl restart network && systemctl restart docker
8、问题记录
-
yum 命令提示 failed to set locale, defaulting to C
echo "export LC_ALL=en_US.UTF-8" >> /etc/profile source /etc/profile
-
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.mirror.aliyuncs.com"], "insecure-registries": ["10.8.80.222:5000"] }
-
podman冲突导致centos8上安装docker失败。
rpm -q podman #查询是否已经安装 yum remove podman #删除podman yum install docker-ce docker-ce-cli
-
状态为 CrashLoopBackOff,Back-off restarting failed container
kubectl delete deployment kubernetes-dashboard -n kubernetes-dashboard kubectl delete service kubernetes-dashboard -n kubernetes-dashboard kubectl apply -f dashboard.yaml
-
状态为 Evicted,提示 The node had condition: [DiskPressure]. 最好还是清理root目录
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf Environment=".... --eviction-hard=nodefs.available<5%" systemctl daemon-reload systemctl restart kubelet #如果没有重新 CreateContain 则删除当前pod
-
docker run build 时出现 Unsupported jarmode ‘layertools’…
将 pom.xml 中 …2.3.5.RELEASE version 改成 2.5.0 -
0/3 nodes are available: 3 pod has unbound immediate PersistentVolumeClaims.
#kubernetes1.20.0 之后就废弃了 selfLink,解决办法是重新加回来 vim /etc/kubernetes/manifests/kube-apiserver.yaml spec: containers: - command: - kube-apiserver #在这儿加上:- --feature-gates=RemoveSelfLink=false kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
9、常用小 tips
- 卸载kubernetes
kubeadm reset
#所有节点都要执行 - 删除pod、deployment、service
kubectl delete deployment DEPLOYMENT_NAME -n NAMESPACE_NAME #1.删除 deployment kubectl delete pod POD_NAME -n NAMESPACE_NAME #2.删除 pod kubectl delete svc/service SERVICE_NAME -n NAMESPACE_NAME #3.删除 service
- kubectl 复制
kubectl cp ./xxx.jar NAMESPACE/POD_NAME:/xxx.jar