Kubernetes的折磨(一):三件套

最近服务器出了点问题,加上一直以来大量运维工作令人崩溃,终于第二次下定决心把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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350