美文网首页K8s安装个人学习工作生活
Kubernetes的折磨(一):三件套

Kubernetes的折磨(一):三件套

作者: 若罗 | 来源:发表于2020-05-11 11:41 被阅读0次

最近服务器出了点问题,加上一直以来大量运维工作令人崩溃,终于第二次下定决心把K8S装上。
但是虽然距离上次踩坑才过去一年,但这个坑却丝毫没有变浅。
加上之前用的是熟练的Ubuntu,这次又换了Centos,感觉需要重新学的东西挺多的。

一、安装kubelet kubeadm kubectl

首先是三件套的安装,一般来说yum和apt都是装不了的,但还好阿里云提供了资源
按照上面的说明,执行以下代码进行安装

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
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

ps: 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl安装

下面是ubuntu的安装手法

apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

apt-get update

#只在控制节点运行
apt-get install -y kubelet kubeadm kubectl
# 在node节点运行
apt-get install -y kubelet kubeadm
# 安装指定版本:
apt-get install kubeadm=1.18.2-00 kubectl=1.18.2-00 kubelet=1.18.2-0

二、下载kubeadm所需要镜像

执行kubeadm config images list可以知道初始化一个集群需要什么镜像,但是k8s.gcr.io我国是用不了的,所以还是得依靠阿里云的源。
我们通过一个shell脚本来假装这个东西是从官方下载的。

#!/bin/sh
images=(
    kube-apiserver:v1.18.2
    kube-controller-manager:v1.18.2
    kube-scheduler:v1.18.2
    kube-proxy:v1.18.2
    pause:3.2
    etcd:3.4.3-0
    coredns:1.6.7
)
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

这个脚本要在所有的服务器上运行,不然join的时候没办法创建容器

三、初始化

首先关闭防火墙和selinux。

sudo systemctl disable firewalld 
sudo systemctl status  firewalld
sudo iptables -P INPUT ACCEPT
sudo iptables -F

Docker和CRI-O都是运行时容器管理工具,后者较轻量一些,但是Docker大家都比较熟悉,所以启动的时候使用Docker作为CRI。(记得Docker要19.03以上)

kubeadm init --cri-socket /var/run/dockershim.sock

这时候如果要选择比如Calico这种网络库,则要指定特定子网,具体方案根据官网的安装需求推荐,下面这个是Calico需要的配置,如果是flannel则为--pod-network-cidr=10.244.0.0/16

kubeadm init --cri-socket /var/run/dockershim.sock --pod-network-cidr=192.168.0.0/16

之后kubeadm会执行一系列的检测(preflight)

[preflight] Running pre-flight checks
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

比如我这里有一个建议让我换docker cgroup引擎的警告。编辑/etc/docker/daemon.json加入

{
    ....
    "exec-opts":["native.cgroupdriver=systemd"]
}

然后重启Docker

systemctl restart docker
systemctl status docker

如果初始化有问题,想要重新init,可以运行kubeadm reset,之后再重新初始化。
初始化的最后会显示,把下面这行保存下来。

kubeadm join 172.18.182.32:6443 --token ??????????????????? \
    --discovery-token-ca-cert-hash sha256:????????????????????????? 

然后我们执行下面的命令,记住要用非root用户,root用户没办法自动读取config

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

而需要这些配置命令的原因是:Kubernetes 集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes 集群。如果不这么做的话,我们每次都需要通过 export KUBECONFIG 环境变量告诉 kubectl 这个安全配置文件的位置。

这个时候查看node状态

[root@sp-141 kubernetes]# kubectl get nodes
NAME     STATUS     ROLES    AGE    VERSION
sp-141   NotReady   master   107m   v1.18.2

发现我们的sp-141是NotReady的状态,这是为什么呢?
我们通过kubectl describe node sp-141来找找原因,在调试 Kubernetes 集群时,最重要的手段就是用 kubectl describe 来查看这个节点(Node)对象的详细信息、状态和事件(Event)。

  Ready            False   Sat, 09 May 2020 13:58:56 +0800   Sat, 09 May 2020 12:13:22 +0800   KubeletNotReady              runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

哦!原来是网络插件没有初始化~

另外,我们还可以通过 kubectl 检查这个节点上各个系统 Pod 的状态,其中,kube-system 是 Kubernetes 项目预留的系统 Pod 的工作空间(Namepsace,注意它并不是 Linux Namespace,它只是 Kubernetes 划分不同工作空间的单位)

[root@sp-141 kubernetes]# kubectl get pods -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-66bff467f8-955g4         0/1     Pending   0          114m
coredns-66bff467f8-vrnhx         0/1     Pending   0          114m
etcd-sp-141                      1/1     Running   2          114m
kube-apiserver-sp-141            1/1     Running   2          114m
kube-controller-manager-sp-141   1/1     Running   1          114m
kube-proxy-42m5s                 1/1     Running   0          114m
kube-scheduler-sp-141            1/1     Running   1          114m

四、安装网络插件

CNI意为容器网络接口,它是一种标准的设计,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。插件负责为接口配置和管理IP地址,并且通常提供与IP管理、每个容器的IP分配、以及多主机连接相关的功能。容器运行时会调用网络插件,从而在容器启动时分配IP地址并配置网络,并在删除容器时再次调用它以清理这些资源。
常用的网络插件有FlannelCalicoCanalWeave,它们各有优势,请选择使用。
目前比较流行的插件请看这里
如果是用Calico或者Cilium,需要再kubeadm的时候指定--pod-network-cidr=x.x.x.x.
所以我们这里先用weave。

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

但是这个用不了,所以我们重新搞一遍,安装Calico。

kubeadm reset
kubeadm init --cri-socket /var/run/dockershim.sock --pod-network-cidr=192.168.0.0/16
kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml
# 或者
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

虽然执行后等了一会,但总算还是可以了,所以选择最推荐的那个addon准没错。

五、加入Worker节点

kubeadm join 172.18.182.32:6443 --token ??????????????????? \
    --discovery-token-ca-cert-hash sha256:????????????????????????? 

之后发现有一些pod都是pendding状态,使用kubectl describe pod kube-proxy-4cnfb --namespace=kube-system查看日志,发现是worker节点镜像拉不到,我们就运行一下那个脚本。

然后过了一会,发现master节点一直没有ready
我们下载下来Calico的yml文件,进行修改(rollo modified的那三行)

            # Cluster type to identify the deployment type
            - name: CLUSTER_TYPE
              value: "k8s,bgp"
            # rollo modified
            - name: IP_AUTODETECTION_METHOD
              value: "interface=eth.*"
            # Auto-detect the BGP IP address.
            - name: IP
              value: "autodetect"

然后重新apply这个yml,一会儿过后,全都正常了

六、使Master结点也可以部署POD

当然我们不是很建议这么搞

kubectl taint nodes --all node-role.kubernetes.io/master-

输出类似这样

node/sp-141 untainted
taint "node-role.kubernetes.io/master" not found
taint "node-role.kubernetes.io/master" not found

七、安装面板

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
kubectl get pods --all-namespaces

需要打开proxy来开放端口

kubectl proxy

当然现在也看不了,因为安全性考虑没有打开远程连接,之后的折磨再战吧!

相关文章

网友评论

    本文标题:Kubernetes的折磨(一):三件套

    本文链接:https://www.haomeiwen.com/subject/zwfdhctx.html