从零开始在ubuntu上安装和使用k8s集群及报错解决

本文详细记录了在Ubuntu上从零开始安装和配置Kubernetes(k8s)集群的步骤,包括安装Docker、配置k8s、设置集群网络、解决遇到的常见错误。通过克隆虚拟机快速部署3台节点的集群,并介绍了如何部署应用以及处理镜像拉取失败等问题。
摘要由CSDN通过智能技术生成


此文首发于我的个人Jekyll博客:zhang0peter的个人博客


这几天在学习K8S的安装和使用,在此记录一下

此文参考了视频教程:两小时Kubernetes(K8S)从懵圈到熟练——大型分布式集群环境捷径部署搭建_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

报错解决在文章最后

安装docker

先安装docker:

curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt update && apt install docker-ce
docker run hello-world

安装kubernetes

docker成功运行后配置k8s的更新源,推荐阿里云:

echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo gpg --keyserver keyserver.ubuntu.com --recv-keys BA07F4FB #对安装包进行签名
sudo gpg --export --armor BA07F4FB | sudo apt-key add -
sudo apt-get update

关闭虚拟内存

sudo swapoff -a #暂时关闭
nano /etc/fstab #永久关闭,注释掉swap那一行,推荐永久关闭

安装最新版的k8s:

apt-get install kubelet kubeadm kubectl kubernetes-cni

其中kubeadm用于初始化环境,kubectl用于操作kubelet
设置开机启动:

sudo systemctl enable kubelet && systemctl start kubelet

查看kubectl版本:

root@ubuntu:/home/ubuntu# kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.2", GitCommit:"59603c6e503c87169aea6106f57b9f242f64df89", GitTreeState:"clean", BuildDate:"2020-01-18T23:30:10Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

配置k8s集群

刚刚已经装好一台虚拟机的k8s,现在要配置2台额外的虚拟机,总共3台,形成k8s集群。

推荐的做法是直接使用vmware自带的克隆功能,这样可以免去重装的烦恼。

共3台机器,分别为 master, node1, node2.

配置虚拟机网络

/etc/hostname中配置主节点为master,node1为 node1,node2为 node2

配置每台机器的/etc/netplan/50-cloud-init.yaml,把DHCP的IP改为固定IP:

network:
    ethernets:
        ens33:
            addresses: [192.168.32.134/24]
            dhcp4: false
            gateway4: 192.168.32.2
            nameservers:
                addresses: [192.168.32.2]
            optional: true
    version: 2

修改/etc/hosts

192.168.32.132 master
192.168.32.133 node1
192.168.32.134 node2

重启机器后能互相ping表示配置成功:

ubuntu@node2:~$ ping master
PING master (192.168.32.132) 56(84) bytes of data.
64 bytes from master (192.168.32.132): icmp_seq=1 ttl=64 time=0.837 ms
64 bytes from master (192.168.32.132): icmp_seq=2 ttl=64 time=0.358 ms

配置Master节点的k8s网络

创建工作目录:

mkdir ~/k8s
cd ~/k8s

生成配置文件:

ubuntu@master:~/k8s$ kubeadm config print init-defaults ClusterConfiguration > kubeadm.conf
W0130 00:57:12.673237    9359 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0130 00:57:12.673539    9359 validation.go:28] Cannot validate kubelet config - no validator is available

修改文件kubeadm.conf中的IP地址

#修改IP地址为master节点的IP地址
localAPIEndpoint:
  advertiseAddress: 192.168.32.132
#配置pod地址
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12

拉取k8s需要的镜像

由于官方镜像地址被墙,所以我们需要首先获取所需镜像以及它们的版本。然后从国内镜像站获取。

ubuntu@master:~/k8s$ kubeadm config images list --config kubeadm.conf
W0130 01:31:26.536909   15911 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0130 01:31:26.536973   15911 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.0
k8s.gcr.io/kube-controller-manager:v1.17.0
k8s.gcr.io/kube-scheduler:v1.17.0
k8s.gcr.io/kube-proxy:v1.17.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
#下载全部当前版本的k8s所关联的镜像
images=(  # 下面的镜像应该去除"k8s.gcr.io/"的前缀,版本换成上面获取到的版本
kube-apiserver:v1.17.0
kube-controller-manager:v1.17.0
kube-scheduler:v1.17.0
kube-proxy:v1.17.0
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)

for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

启动 kubeadm 和 kubelet

镜像拉取完成后启动:

ubuntu@master:~/k8s$ sudo swapoff -a
ubuntu@master
这个错误是由于在执行 `kubeadm config images pull` 命令时无法从指定的镜像仓库中拉取镜像引起的。具体报错信息显示了以下内容: ``` failed to pull image "registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.0": output: E0715 01:48:45.987722 1704 remote_image.go:171] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.0\": failed to resolve reference \"registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.0\": failed to do request: Head \"https://registry.aliyuncs.com/v2/google_containers/kube-apiserver/manifests/v1.25.0\": dial tcp: lookup registry.aliyuncs.com on 10.0.0.2:53: read udp 10.0.0.81:55655->10.0.0.2:53: i/o timeout" image="registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.0" time="2023-07-15T01:48:45-04:00" level=fatal msg="pulling image: rpc error: code = Unknown desc = failed to pull and unpack image \"registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.0\": failed to resolve reference \"registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.0\": failed to do request: Head \"https://registry.aliyuncs.com/v2/google_containers/kube-apiserver/manifests/v1.25.0\": dial tcp: lookup registry.aliyuncs.com on 10.0.0.2:53: read udp 10.0.0.81:55655->10.0.0.2:53: i/o timeout" , error: exit status 1 ``` 错误信息中提到了以下几个关键点: 1. `failed to resolve reference`:无法解析镜像引用,可能是由于网络问题导致无法访问指定的镜像仓库。 2. `dial tcp: lookup registry.aliyuncs.com on 10.0.0.2:53: read udp 10.0.0.81:55655->10.0.0.2:53: i/o timeout`:在解析镜像仓库地址时发生了 I/O 超时的错误。 根据这些信息,我推测可能有以下原因导致了这个问题: 1. 网络连接问题:可能是由于网络连接不稳定或者存在防火墙等限制,导致无法访问指定的镜像仓库。你可以尝试检查网络连接是否正常,以及是否有任何网络限制。 2. DNS 解析问题:可能是由于 DNS 解析失败导致无法解析指定的镜像仓库地址。你可以尝试检查 DNS 配置是否正确,并且能够正常解析该镜像仓库地址。 希望这些信息能帮助到你解决问题。如果有任何进一步的疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值