K8s部署实战 Kubernetes v1.21.0-0 + DashBoard v2.0.0(超详细)

0、步骤总览
  1. 虚拟机集群,网络设置,能相互ping通,都能访问外网。关闭防火墙、swap、selinux,统一时间
  2. 安装Docker,安装Kubernetes组件:kubectl+kubeadm+kubelet。
  3. 安装registry私库,在master上进行,能正常pull/push;安装registry-web便于查看
  4. 安装kube 主节点(master),kubeadm init… 安装flannel网络插件 get pod 查看运行状态均为running
  5. 安装kube 子节点(slave),kubeadm join… 加入主节点,get node 查看正常加入状态为ready
  6. 安装dashboard
  7. 部署Java服务:制作镜像+使用Dockerfile上传+使用app.yaml部署
  8. 问题记录:部署过程中遇到的问题,不一定必现

主节点需要执行: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

访问:192.168.126.200:30080

更多操作可参考:https://www.jb51.net/article/190338.htm

部署Java服务报错整理:

  1. 运行 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

  2. 运行 Springboot 项目编译版本 52 required but 54 given
    修改 pom.xml 文件的 ,改为8

  3. docker run … 发现容器刚启动就退出了

  4. 报错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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七里香的秋刀鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值