k8s那点事儿dockerKubernetes

devops(1)- k8s安装记录

2019-11-08  本文已影响0人  justaplayer

原文链接:https://blog.scorpii.net/2019/11/04/k8s/

前言

本来想记录一些我在微服务实践中的一点点经验。但是由于微服务牵扯到 devops ,一个好一点的 devops 又不得不提到 k8s 。于是最后还是打算先从 k8s 说起。

下面会记录全新安装一个 k8s 的过程。因为我本身也是丢三落四的性格,所以很容易踩坑,正好就可以借着踩坑的机会来介绍一下如何解决 k8s 的一些简单的报错。

环境

我们使用vbox虚拟三个服务器,开一个网卡,设置成桥接,这样虚拟机之间既可以互通也能够访问外网(不管你怎么设置只要能达到这个目的就行)。之后的文章中可能ip会有变化,这个不用放在心上。

操作系统我们选择 ubuntu server 18.04 。这三个服务器都固定 ip 地址,并且都安装 docker

hostname cpu mem ip
no1 2 2G 10.3.11.117
no2 2 2G 10.3.11.118
no3 2 2G 10.3.11.119

我们先配置第一台服务器

说明一下:之后的操作都是直接使用 root 操作

安装需要的包

apt update
apt install -y apt-transport-https ca-certificates curl software-properties-common
#docker源
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

#kubeadm源
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

#安装docker、kubeadm以及k8s中不会通过docker容器部署的组件
apt update
apt install -y docker-ce kubeadm kubelet kubectl

初始化

开始初始化k8s

kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

初始化时 --image-repository 参数设置为阿里云的镜像。 --pod-network-cidr 参数设置 pod 网络范围为 10.244.0.0/16 这个范围是流行的网络方案插件 flannel 默认使用的范围,如果你不知道这是什么就不要修改它。

接着我们看到了报错:

kubeadm init 报错

两个 warning ,和一个 error。通常 warning 是不会停下来的,这里是因为出现 error 导致安装终止。虽然 warning 不致命,不过既然都停下来了,那就看看能解决就一起解决了吧。

第一个 warning 的意思是, kubeadm 检测到当前 dockercgroup drivercgroupfs ,而建议的 cgroup driversystemd 。后面给了个文档链接让你去看。文档里提到需要对 docker 进行配置,代码如下:

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

然后重启 docker

systemctl daemon-reload
systemctl restart docker

这样第一个 warning 解决了。

第二个 warning 说的是新版本的 docker 还没有经过 k8s 的兼容性测试,这个一般生产环境遇到了最好就降 docker 的级,我这里是演示安装就不降级了。

我们看看最后一个 error。就是叫你关闭 swap 。我们直接永久关闭 swap ,修改 /etc/fstab 文件,注释掉 swap 那行。

注释swap

然后重启一下。

重置一下 kubeadm ,并且重新 init 。这里注意,以后不管什么错误导致安装终止,解决问题之后都先 reset 一下,保证下次安装不会被上次的安装影响。

kubeadm reset
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

以上的问题解决过程在之后我们在其他服务器上安装 k8s 时就可以直接放到搭建环境那一块去。从这个过程也可以看出,其实报错信息是比较详细的,所以当我们在 k8s 中遇到问题时,还是需要多静下心来仔细看报错信息。问题解决完了,我们来看看其他东西。首先最上面的两条日志 could not fetch a Kubernetes version.....falling back to the local client..... 就是说 kubeadm 最开始是打算获取 https://dl.k8s.io/release/stable-1.txt 这个文件看看当前最新稳定版是多少,奈何这个 url 被墙了,于是就用了 kubeadm 本身的版本号。从这里能看出来, kubeadm 的版本号是与 k8s 的版本号同步的。同时,这也说明 kubeadm 是有可能可以指定版本号安装 k8s 的。真的可不可能呢?我们以后再来研究。其次,倒数第三行的 If you know what you are doing...,是说如果你知道你在做什么,那么你可以通过 --ignore-preflight-errors=... 这个参数来跳过 error 。我们也是以后再来研究。最后,倒数第二行应该都能看懂了吧?

等了几分钟,程序提示我们安装成功。同时也对我们接下来的操作作了详细的说明,大佬们其实很为我们这些菜鸟着想~

success

信息量有点大,别怕,我分成了三个部分,我们一块一块的解决。

  1. 让你跟着上面的命令输,这个直接复制粘贴就好。看里面的 config 字样也就知道目的是为了对 k8s 做一些初始化配置。

  2. 告诉你应该安装一个网络方案的插件。我们现在可以输入 k8s 命令来看看没有安装网络插件的情况下 k8s 的状态:

    kubectl --namespace kube-system get pod
    
    k8s system status

    可以看到有两个组件是 pending 状态,在 k8s 中,只有所有组件都是 running 状态才算真正安装成功。

    这里我们安装流行的 flannel 网络方案插件,对于 k8s 来说,安装一个插件其实就是应用一个插件的配置文件, kubectl apply 就是应用配置文件的命令。另外这个命令还支持 http 协议。 flannel 的配置文件我们可以直接在 githubflannel 的官方仓库拿到 url ,是 https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 。我们可以先在浏览器上打开看看,这里我特别截取一块出来:

    part of yml

    还记得前面初始化 k8s 时使用的 --pod-network-cidr 参数吗?就是对应的这里的值。 flannel 默认使用这个网络地址范围。如果你需要修改 pod 的网络地址范围,那么这里也要改成相应的值。这里我们保持默认,就直接通过 url 来应用配置文件,代码如下:

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

    安装完成以后我们等个几分钟再来看看组件的状态:

    apply flannel

    已经都 running 了。

  3. 告诉你之后如果要将其他服务器加入到 k8s 中,就在环境装好以后输入它上面的那条 join 命令。这条命令你不用记下来,因为之后可以通过 kubeadm 命令再次获取它。

另外两个服务器

我们来部署第二台服务器,根据上面的流程搭建和配置环境:

当我们部署 no1 后,因为只有一个节点,所以 no1 默认自己就是 master 。之后我们再部署其他服务器时只需要通过 kubeadm join 命令加入到这个 master 上即可。还记得部署好 no1 时得到的 join 命令吗?没记住没关系,反正24小时之后 token 就过期了。 join 命令有三个参数,第一个是 masterip 和端口,第二个是 token ,第三个是证书的 hash 值。重新生成这么一条命令不是不可能,就是有点麻烦,而在日常工作中我们可能经常需要生成这条命令,所以我们把生成这条命令的过程做成一个脚本。正好已经有大佬写了这个脚本,我们就直接拿来用。代码如下:

#!/bin/bash

if [ $EUID -ne 0 ];then
    echo "You must be root (or sudo) to run this script"
    exit 1
fi

if [ $# != 1 ] ; then
    echo "Usage: $0 [master-hostname | master-ip-address]"
    echo " e.g.: $0 api.k8s.hiko.im"
    exit 1;
fi

token=`kubeadm token create`
cert_hash=`openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'`

echo "Refer the following command to join kubernetes cluster:"
echo "kubeadm join $1:6443 --token ${token} --discovery-token-ca-cert-hash sha256:${cert_hash}"

把上面的代码复制到 no1 的新文件中,命名 join.sh ,然后执行他:

generate join

得到 join 命令,将命令复制到 no2 中执行。

等待一下,看到已经部署成功。

join success

然后还告诉你可以通过 kubectl get nodes 命令查看。我们在 no1 上输入命令看看:

get nodes

最后, no3 也是同样的方法。

get nodes

这样我们就搭建好了3个节点的 k8s 了。

小结

k8s 安装好了,有一些事情需要接下来做:

  1. 了解各种网络方案插件,可以着重了解一下 flannel
  2. 可以了解一下 dockercgourp driver
  3. 了解一下 k8s 中各个组件的作用
  4. 熟悉一下 k8s 的常用命令
  5. 熟悉一下 k8s 配置文件的写法
  6. 上面说要以后研究的两个问题

引用

下一篇:devops(2)- traefik安装

上一篇下一篇

猜你喜欢

热点阅读