Ubuntu18.04部署k8s

k8s架构图:

k8s架构图

前言:本文以两台机器为例,叙述k8s的安装部署过程,1台机器为master节点,另一台为node节点,master节点不参与部署业务pod。服务器操作系统为Ubuntu18.04 Server

0X00 部署前置操作

以下为Master节点和Node节点均需执行的部署前置操作

1.安装Docker

此处需要注意安装的Docker版本是否被k8s支持,比如k8s V1.20最高只支持Docker V19,那么安装Docker V20是不行的,可以在安装Docker指定Docker版本

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update

# Step 5: 查看支持安装的Docker版本
apt-cache madison docker-ce

# Step 6: 安装指定版本的docker-ce
sudo apt-get -y install docker-ce=5:19.03.13~3-0~ubuntu-bionic

继续注意:安装完docker-ce后,使用docker --version命令看到的版本是docker cli版本,并不是docker server版本,而k8s是对docker server版本有要求,所以docker cli版本无所谓。安装docker-ce 19.03后,你会发现docker cli版本是20.10,这个是没关系的。可以使用docker info命令查看docker server版本

2.安装k8s相关组件

具体需要安装kubelet kubeadm kubectl。由于从国外下载需要翻墙,所以添加阿里的仓库,从阿里仓库下载

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

3.统一docker和k8s的cgroup机制(https://www.cnblogs.com/hongdada/p/9771857.html)

两种cgroup机制:cgroupfs和systemd

使用docker info命令查看docker使用的cgroup机制:

Cgroup Driver: cgroupfs

修改docker的cgroup机制为systemd,保持docker和k8s的cgroup机制一致。vim /etc/docker/daemon.json,写入以下内容:

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

重启docker:

systemctl restart docker
systemctl enable docker

4.k8s要求关闭swap

# 临时
swapoff  -a

# 永久
swapoff -a && sysctl -w vm.swappiness=0  # 关闭swap
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab  # 取消开机挂载swap

注意:swapoff -a 命令只会临时关闭swap,如果采取该方式关闭swap,在重启系统后swap又会开启,将导致k8s启动失败。如果k8s启动失败,可以关闭swap后运行以下命令(该命令与部署无关,仅作提醒)

systemctl daemon-reload
systemctl restart kubelet

5.设置系统参数允许路由转发,不对网桥的数据进行处理

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

6.关闭防火墙

systemctl stop ufw
systemctl disable ufw

0X01 Master节点

1.集群初始化

在Master节点上执行集群初始化命令,node节点不需要。

(1)初始化有很多参数可以选择,最重要的参数是指定国内镜像源,因为默认会从国外的仓库拉取所需镜像,需要挂代理。指定国内镜像源后可以直接下载,非常方便(https://www.cnblogs.com/zhaopengcheng/p/13582933.html)

--image-repository registry.aliyuncs.com/google_containers

k8s自身不携带CNI(Container Network Interface),所以需要依赖第三方的插件,例如比较常用的flannel。

Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。Flannel实质上是一种“覆盖网络(overlaynetwork)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,默认的节点间数据通信方式是UDP转发。(https://www.cnblogs.com/goldsunshine/p/10740928.html#4752484)

有个很坑爹的地方,使用flannel需要在集群初始化时指定--pod-network-cidr,指定pod使用的IP地址块。如果在没有指定该参数的情况下初始化了集群,那么将无法成功安装flannel,我就遇到了这个问题,在只指定了使用国内仓库的情况下初始化了集群,导致集群网络出现问题,最后只好推倒重来。IP地址块参数自行决定,只要不和现有的IP冲突即可。

啰嗦完了,执行初始化命令,大概需要几分钟,因为需要从网络下载相关镜像:

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

(2)初始化成功后注意下命令的输出,你会看到以下内容:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

可以看到接下来有两个步骤:

1.创建kube相关目录,复制配置文件到相关目录

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

2.安装网络插件flannel(如果遇到网络不通问题,多试几次)

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

3.保存好返回给你的kubeadm join命令,这是让你node节点加入集群的命令。token和ca-cert-hash参数需要保密,这是node加入集群的凭证

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

如果没有记录kubeadm join命令,可以通过以下方式获取到相关参数:

手动获取获取token:

kubeadm token list

手动获取ca-cert:

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

重新生成完整的加入集群的命令:

kubeadm token create --print-join-command

0X02 Node节点

1.Node节点加入集群

直接在Node节点上执行刚才保存的kubeadm join命令即可:

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

0X03 查看集群工作状态

1.查看集群Node信息

kubectl get nodes

如果Node节点的status不为ready,可以稍微等一等,需要一定时间适配

2.查看pod信息

kubectl get pods --all-namespaces

应该输出截图中的内容,需要注意的是如果网络配置没有问题,那么红框标注的容器应该均为Running状态。flannel容器初始化需要的时间比较长,可以稍微等等,不要急着进行别的操作。

0X04 节点角色设置

初始化完成后默认所有节点都是没有角色的,需要手动设置节点角色

设置Master节点:

kubectl label nodes your_node_name node-role.kubernetes.io/master=

设置Node节点:

kubectl label nodes your_node_name node-role.kubernetes.io/node=

还发现一个情况,可以设置一个节点同时为master和node:

0X05 额外的一些东西

1.重新初始化

如果集群初始化之后,发现存在问题,例如init时缺少参数,导致需要重新初始化,可以采取以下措施:

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#tear-down

2.查看kubelet日志

journalctl -f -u kubelet  # 查看kubelet日志
journalctl -f -u kubelet > kubelet.log  # 将日志输出到本地文件查看

 

4.参考文档

k8s官方部署文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

安装部署:https://github.com/qxl1231/2019-k8s-centos

 

最后:本人也尚在初学阶段,如有错误,还请包涵,欢迎交流~

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值