腾讯云轻量搭建K8s遇到的坑 Ubuntu20.04系统

K8S集群搭建

K8S的集群大体上分为两类:一主多从与多主多从。

  • 一主多从: 存在单机故障风险,搭建简单,适用于测试环境
  • 多主多从: 搭建麻烦,安全性高,适用于生产环境

安装: 有三种安装方式:minkube(快速单间单节点k8s的工具), kubeadm快速搭建k8s集群的工具, 二进制包(从官网一个一个下,比较麻烦但是理解的更深刻)

咱就是说坑踩多了就老老实实的跟着教程走:

  1. 关闭swap, 关闭防火墙(ufw), 写入主机名, 设置时戳:

    (Tips: swap 指允许我们使用虚存, 必须禁用放置性能抖动。主要是k8s这么要求的)

    sudo nano /etc/hosts    	# 设置主机名
    sudo ufw disable			# 关闭防火墙
    sudo nano /etc/fstab		# 关闭swap
    sudo timedatectl set-timezone Asia/Shanghai 	# 设置时间戳保持相同
    
    # 关于为什么centos需要关闭selinux而ubuntu不需要,,兄弟你确定你装selinux了么
    
  2. 安装docker, 按照官方文档来就行,或者https://docs.docker.com/engine/install/ubuntu/

  3. 安装kubeadm, kubectl, kubelet:

    # 更新并与允许 curl HTTPs的访问,没装过的装一下
    # sudo apt-get update && sudo apt-get install -y apt-transport-https
    
    # 去阿里云去搞一个密钥。 注,这句话只能由root运行,不也能使用sudo。畏怯一般来说都要运行这句话的
    curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
    
    #新增源
    sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF 
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF
    
    # 更新并安装三组件: kubelet,  kubeadm,  kubectl
    sudo apt-get install -y kubelet kubeadm kubectl
    
    # 遇到的问题1:缺少依赖,缺少啥咱就安啥
    The following packages have unmet dependencies:
     kubelet : Depends: ebtables but it is not going to be installed
    E: Unable to correct problems, you have held broken packages.
    sudo apt-get install ebtables
    
    # 遇到问题二,版本不兼容
    kubelet : Depends: iptables (>= 1.4.21)
    E: Unable to correct problems, you have held broken packages.
    
    # 升级, 核心包版本不兼容
    apt-get upgrade iptables
    iptables : Depends: libip4tc0 (= 1.6.1-2ubuntu2) but it is not going to be installed
               Depends: libip6tc0 (= 1.6.1-2ubuntu2) but it is not going to be installed
               Depends: libiptc0 (= 1.6.1-2ubuntu2) but it is not going to be installed
               Depends: libxtables12 (= 1.6.1-2ubuntu2) but 1.8.4-3ubuntu2 is to be installed
    # 这里报错更高版本的包已经装过了,坑点,不要卸载这个更高版本的包(笔者的一时手欠加忘拍快照直接报废了一个系统),直接安装需要的版本的包即可,不然系统直接挂了
    apt-get install libxtables12=1.6.1-2ubuntu2
    # 之后递归向上更新即可
    apt-get upgrade iptables
    sudo apt-get install -y kubelet kubeadm kubectl
    
  4. 初始化:

    # 这里本来可以设置apiserver和版本,但是我的版本是一样的再加上设不设置都一样我就没管
    kubeadm init \
    # 设置镜像源。如果不设置就需要翻墙
    	--image-repository registry.aliyuncs.com/google_containers \
    	--service-cidr=10.96.0.0/12 \
    	--pod-network-cidr=10.244.0.0/16
    # 这里坑点巨多,我接下来讲解我遇到的坑
    
    • 如果你想在公网搭建,并且有一台有公网IP的机子,你首先要明确:

      • 是别人家的云服务器?恭喜你,现在市面上的云服务器多半是虚拟网卡的。什么意思呢,就是说你去解析127.0.0.1的时候,它找不到对应的公网地址。在init初识化状态中,你定义了apiserver他会尝试去解析127.0.0.1 与你apiserver的关系。但最后很遗憾的它连不上,然后就会卡死,超时,初识化失败。这里有一篇应对的方法,但是我是没复现出来,放在这里https://zhuanlan.zhihu.com/p/74134318。毕竟集群这玩应就是和私网搭建
      • 如果是你自己的有公网IP的机子,恭喜你不会遇到上面的问题。由于我没有遮掩的机子,会遇到什么问题我不知道,需要你自行探索
    • 初始化后又重新搭建:

      会发现有一堆要关掉的占用端口的进程和要删除的文件。这个时候用下面的命令即可。主节点和从节点都要运行这个命令

      kubeadm reset
      

      值得注意的是,如果你已经构建到了最后一步,即运行了如下三条命令。那么你还需要将新创建的文件夹删除。否则表面上看没什么影响。实际在其他节点加入集群的时候回产生证书问题

      # mkdir -p $HOME/.kube
      # sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      # sudo chown $(id -u):$(id -g) $HOME/.kube/config'''
      rm -r $HOME/.kube
      
    • 单节点k8s集群。

      对于单纯想了解学习k8s的搭建丹姐点的同学请运行如下命令,确包此节点允许单节点运行pod.否则之后部署查询的时候会在日志里见到相关的warning, 同时pod的状态也会一直 ready 0/1

      # 这句语句请在至少部署一个service 与 pod 后运行
      kubectl taint nodes --all node-role.kubernetes.io/master-
      
  5. K8s中的插件部署。K8s的网络是使用插件的方式安装的。比较流行的插件网络有flannel, calico等。 我们只需要在master网络安装插件即可。以flannel为例:

    # 直接找改过仓库的版本:
    https://blog.csdn.net/weibo1230123/article/details/122233331
    kubectl apply -f flannel.yml
    # 这一段是运行的结果
    Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
    podsecuritypolicy.policy/psp.flannel.unprivileged configured
    clusterrole.rbac.authorization.k8s.io/flannel created
    clusterrolebinding.rbac.authorization.k8s.io/flannel created
    serviceaccount/flannel unchanged
    configmap/kube-flannel-cfg unchanged
    daemonset.apps/kube-flannel-ds created
    #获取node状态,变成ready, 成功
    kubectl get nodes
    NAME             	STATUS   	ROLES                  		AGE     VERSION
    vm-0-13-ubuntu   	Ready    	control-plane,master   	8m45s   v1.23.5
    vm-4-9-ubuntu    	Ready    	<none>                 		3m36s   v1.23.5 
    

至此,k8s的基本环境就搭建的该一段落了。接下来我们开始我们的第一个deemo 部署

K8S 部署项目1:Nginx

# 先下载镜像
kubectl create deployment nginx  --image=nginx
deployment.apps/nginx created
# 准备暴漏端口。我我想放在80端口上,先查一下80端口是否占用:
netstat -tunlp| grep :80
# 暴漏端口,port直容器暴漏给外部的端口
kubectl expose deploy nginx  --port=80  --type=NodePort
service/nginx exposed

# 查看状态
kubectl get pods,svc
# Ready 1/1就说明搭建成功
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-85b98978db-4ffg9   1/1     Running   0          4m46s

# svc 指先在运行的service.我们访问的时候都是访问主节点,主节点分发给到响应路由
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        24m
service/nginx        NodePort    10.99.177.13   <none>        80:31524/TCP   37s

# 访问一下, 我靠超时,怎么肥事,我们排查在哪台node上运行,
curl http://10.0.0.13:31254
# 超时无反应

kubectl get pod -A -owide
NAMESPACE   NAME                    READY   STATUS    RESTARTS   AGE     IP           NODE             NOMINATED NODE   READINESS GATES
default     nginx-85b98978db-5npc5  1/1     Running   0          2m41s   10.244.1.2   vm-0-2-ubuntu    <none>           <none>
# 我们找一下另一台节点, 是成功的。。
curl http://10.0.0.2:31254
<!DOCTYPE html>
Nginx
</html>

这说明转发失败,我们来回溯一下,按照这篇博客排查 https://blog.csdn.net/u014299266/article/details/122325327:

  1. 查看网络插件:

    netstat -rn
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    # 存在网络插件
    10.244.0.0      10.244.0.0      255.255.255.0   UG        0 0          0 flannel.1
    
  2. 查看是否允许转发

    iptables -L -n
    # 果然,不允许(我的master节点)
    Chain FORWARD (policy DROP)
    
    # 设置允许
    echo "net.ipv4.ip_forward = 1" >> /usr/lib/sysctl.d/50-default.conf
    sysctl -p
    reboot
    
  3. 但是当我们满心欢喜的等待重启后发现,wtf还是连不上。等等我知道问什么了。 机器A 访问不到机器B 的docker 内网环境10.244.1.2。 那接下来的问题就是跨机器容器互联了。本来这是flannel的活,为啥flannel没起作用就是我们需要探究的东西了。

    kubectl get pod -A -owide
    NAMESPACE  NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE             NOMINATED NODE   READINESS GATES
    default    nginx-85b98978db-9mv8d   1/1     Running   0          18m   10.244.1.2   vm-0-2-ubuntu    <none>           <none>
    
  4. 好吧,原因是因为版本不兼容,我之前一直把warnning当成屁是我的问题.那我们退回

    Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
    # 我退回到1.18的版本,再重来一边的时候发现又变成0/1 了
    # 找找原因
    kubectl describe pod nginx-f89759699-zftx6 -n kube-system
    # 原来是网络插件没删干净。因为我中间尝试了calico也不行,如果你们没有尝试就不用看这条
    关于flannel没有卸干净:https://blog.csdn.net/weixin_34409741/article/details/92513036
    关于calico没 卸载干净:https://www.cnblogs.com/linux-0318/p/14745671.html
    
  5. 还是不行,这是咋回事。。我又海查了资料,发现,最终找到了这一条:腾讯云的机子由于虚拟网卡的问题,想要使用flannel就要打开端口,udp的8472端口。由于我只打开了TCP端口。所以不行。害,这次定位完之后终于成功了

    root@VM-0-13-ubuntu:~# kubectl get pods,svc
    NAME                        READY   STATUS    RESTARTS   AGE
    pod/nginx-f89759699-vwjnl   1/1     Running   0          53m
    
    NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        55m
    service/nginx        NodePort    10.96.22.96   <none>        80:32532/TCP   53m
    root@VM-0-13-ubuntu:~# curl 127.0.0.1:32532
    <!DOCTYPE html>
    Nginx
    </html>
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ubuntu 20.04上安装Kubernetes(k8s),你可以按照以下步骤进行操作: 1. 首先,你可以根据[参考1]中提供的博客文章,按照里面的指导进行安装。该博客文章提供了适用于任何版本的Kubernetes安装的方法。 2. 在安装Kubernetes之前,你可能需要禁用SELinux。你可以参考[参考2]中提供的教程,了解如何在Ubuntu 20.04上禁用或启用SELinux。 3. 在生产环境中,建议使用防火墙并开放指定的端口。你可以使用以下命令禁用Ubuntu上的ufw防火墙: ```shell sudo ufw disable ``` 如果你使用的是CentOS,则可以使用以下命令停止firewalld服务并禁用启动: ```shell systemctl stop firewalld && systemctl disable firewalld ``` 注:以上命令是针对Ubuntu和CentOS的示例,请根据你的实际操作系统进行相应调整。 4. 在安装完成后,你可能需要修改Kubernetes的配置以满足你的需求。你可以根据实际情况进行调整和配置。 请记住,这只是一个大致的指导,具体的步骤和配置可能会因你的环境和需求而有所不同。因此,建议你参考[参考1]中提供的博客文章,以获得更详细的安装步骤和配置说明。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ubuntu20.04安装k8s(1.18.4 & 1.22.0)](https://blog.csdn.net/qq_43159578/article/details/123849175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值