0
点赞
收藏
分享

微信扫一扫

K8S复习(二):kubernetes部署(docker)

小龟老师 2022-04-20 阅读 82

写在前面:

本次部署实验所用操作系统是rhel7.6,所有节点时间同步,我是一个母镜像科隆出来的主机,如果在不同主机上部署时间同步

参考文档链接:https://kubernetes.io/zh/docs/home/

部署任务:部署三个master,两个worker

部署方式:docker和containerd

方法一:使用docker部署kubernetes

1、系统环境

rhel7.6 、关闭节点的selinux和iptables防火墙

2、所有节点部署docker引擎

具体操作:

安装docker引擎,设置docker开机自启

[root@server1 yum.repos.d]# cd /etc/yum.repos.d
[root@server1 yum.repos.d]# vim docker.repo

[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0
[extras]
name=extras
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
gpgcheck=0

[root@server1 yum.repos.d]# yum repolist        ##可以看见docker仓库被列出
[root@server1 yum.repos.d]# yum install -y docker-ce
##为了方便实验,我们做一下节点之间的免密,也可以不做
[root@server1 yum.repos.d]# ssh-keygen
[root@server1 yum.repos.d]# ssh-copy-id server2
[root@server1 yum.repos.d]# ssh-copy-id server3
[root@server1 yum.repos.d]# scp docker.repo server2:/etc/yum.repos.d/
[root@server1 yum.repos.d]# scp docker.repo server3:/etc/yum.repos.d/
#在剩余节点安装docker
[root@server2 yum.repos.d]# yum install -y docker-ce
[root@server3 yum.repos.d]# yum install -y docker-ce
#在所有节点设置docker开机自启
[root@server1 yum.repos.d]# systemctl enable --now docker
[root@server1 yum.repos.d]# ssh server2 systemctl enable --now docker
[root@server1 yum.repos.d]# ssh server3 systemctl enable --now docker

设置docker引擎

[root@server1 sysctl.d]# cd /etc/docker/
[root@server1 yum.repos.d]# docker info ##查看docker系统信息
[root@server1 yum.repos.d]# cd /etc/sysctl.d/    ##调整内科选项
[root@server1 sysctl.d]# vim k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
[root@server1 sysctl.d]# sysctl --system    ##使之生效
[root@server1 sysctl.d]# scp k8s.conf server2:/etc/sysctl.d/
[root@server1 sysctl.d]# scp k8s.conf server3:/etc/sysctl.d/
[root@server1 sysctl.d]# ssh server2 sysctl --system
[root@server1 sysctl.d]# ssh server3 sysctl --system        ##在所有节点上使之生效
[root@server1 ~]# swapoff -a            ##禁用交换分区
[root@server1 ~]# vim /etc/fstab
    #/dev/mapper/rhel-swap   swap                    swap    defaults        0 0        ##将这一行注释
server2、server3上重复操作即可

 做完这些操作我们的docker引擎就安装完成了

安装kubeadm

Before you begin

一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
2 CPU 核或更多
集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
开启机器上的某些端口。请参见这里 了解更多详细信息。
禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。


确保每个节点上 MAC 地址和 product_uuid 的唯一性

你可以使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址
可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。

检查网络适配器

如果你有一个以上的网络适配器,同时你的 Kubernetes 组件通过默认路由不可达,我们建议你预先添加 IP 路由规则,这样 Kubernetes 集群就可以通过对应的适配器完成连接。

允许 iptables 检查桥接流量

确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter。

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。

安装 runtime

为了在 Pod 中运行容器,Kubernetes 使用 容器运行时(Container Runtime)。

默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。

如果你不指定运行时,则 kubeadm 会自动尝试检测到系统上已经安装的运行时, 方法是扫描一组众所周知的 Unix 域套接字。 下面的表格列举了一些 kubeadm 查找的容器运行时及其对应的套接字路径:

运行时                    域套接字
Docker Engine        /var/run/dockershim.sock
containerd           /run/containerd/containerd.sock
CRI-O                /var/run/crio/crio.sock


如果同时检测到 Docker Engine 和 containerd,kubeadm 将优先考虑 Docker Engine。 这是必然的,因为 Docker 18.09 附带了 containerd 并且两者都是可以检测到的, 即使你仅安装了 Docker。 **如果检测到其他两个或多个运行时,kubeadm 输出错误信息并退出。**
kubelet 可以使用已弃用的 dockershim 适配器与 Docker Engine 集成(dockershim 是 kubelet 本身的一部分)。

modprobe br_netfilter        ##确保我们有此模块(红帽系统改内核参数自动添加)

[root@server1 ~]# cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
运行后会在/etc/docker/生成daemon.json文件
其中 "exec-opts": ["native.cgroupdriver=systemd"] ##将cgroup驱动改成systemd
改文件里的参数都可以通过docker info 查看
[root@server1 docker]# systemctl restart docker    ##重启docker
[root@server1 docker]# docker info > docker_test   ##将docker info查询的信息写入docker_test文件
22  Cgroup Driver: systemd
可以看见第22行变成了systemd,做实验不用生成这个文件,这里是为了方便演示
[root@server1 docker]# scp  daemon.json server2:/etc/docker/
[root@server1 docker]# scp  daemon.json server3:/etc/docker/
[root@server1 docker]# ssh server2 systemctl restart docker
[root@server1 docker]# ssh server3 systemctl restart docker

此时docker的runtime已经配置完成

安装 kubeadm、kubelet 和 kubectl

kubeadm:用来初始化集群的指令。

kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

kubectl:用来与集群通信的命令行工具。

[root@server1 yum.repos.d]# vim /etc/yum.repos.d/docker.repo        ##在刚才配置的yum源中加入一条
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
[root@server1 yum.repos.d]# yum list kubeadm
[root@server1 yum.repos.d]# scp docker.repo server2:/etc/yum.repo.d
[root@server1 yum.repos.d]# scp docker.repo server3:/etc/yum.repo.d
[root@server1 yum.repos.d]# yum install -y kubeadm kubelet kubectl        ##不指定版本默认就是最新版
[root@server1 yum.repos.d]# ssh server2 yum install -y kubeadm kubelet kubectl
[root@server1 yum.repos.d]# ssh server3 yum install -y kubeadm kubelet kubectl
[root@server1 yum.repos.d]# systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
## kubelet 循环启动,因为此时还没配置所以启动必然失败,但是会循环检测集群的状态
[root@server1 yum.repos.d]# ssh server2 systemctl enable --now kubelet
[root@server1 yum.repos.d]# ssh server3 systemctl enable --now kubelet

目录

写在前面:

方法一:使用docker部署kubernetes

1、系统环境

2、所有节点部署docker引擎

安装docker引擎,设置docker开机自启

设置docker引擎

安装kubeadm

Before you begin

确保每个节点上 MAC 地址和 product_uuid 的唯一性

检查网络适配器

允许 iptables 检查桥接流量

安装 runtime

安装 kubeadm、kubelet 和 kubectl

使用 kubeadm 创建集群


[root@server1 ~]# kubeadm config print init-defaults    ##查看默认配置信息,需要科学上网,否则不能拉取镜像
[root@server1 ~]# kubeadm config images list        ##列出安装所需要镜像,从默认仓库里下载,不翻墙拉不下来
[root@server1 ~]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers        ##我们使用阿里云,这条命令覆盖原有拉取策略
[root@server1 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers    ##初始化
[root@server1 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@server1 ~]# vim .bash_profile     ##将 export KUBECONFIG=/etc/kubernetes/admin.conf 写入其中
[root@server1 ~]# wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
[root@server1 ~]# vim kube-flannel.yml
[root@server1 ~]# echo 'source <(kubectl completion bash)' >> bashrc    ##kubectl可以补齐
[root@server1 ~]# source .bashrc        ##刷新
##此时我们的join命令找不到了
[root@server1 ~]# kubeadm token list    ##列出token
[root@server1 ~]# kubeadm token create --print-join-command    ##创建token会打印join命令,此时我们有两个token
用创建的token在server2,server3上执行
[root@server2 ~]# kubeadm join 172.25.31.1:6443 --token ifn3y4.i2bxx5h2eiktkzne --discovery-token-ca-cert-hash sha256:7df54bba99623afb2ad054ec64c530d2ffbf4fb09d38240fcb26b7a6754c3eac
[root@server3 ~]# kubeadm join 172.25.31.1:6443 --token ifn3y4.i2bxx5h2eiktkzne --discovery-token-ca-cert-hash sha256:7df54bba99623afb2ad054ec64c530d2ffbf4fb09d38240fcb26b7a6754c3eac

此时集群就部署完毕了,可以使用 kubectl get node  命令查看

举报

相关推荐

0 条评论