准备工作
系统要求
Docker
支持 64 位版本 CentOS 7/8
,并且要求内核版本不低于 3.10
。 CentOS 7
满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2
存储层驱动)无法使用,并且部分功能可能不太稳定。
卸载旧版本
旧版本的 Docker
称为docker
或者 docker-engine
,使用以下命令卸载旧版本:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
使用 yum 安装
执行以下命令安装依赖包:
sudo yum install -y yum-utils
鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。
执行下面的命令添加yum
软件源:
# or 国内源
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# or 官方源
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
如果需要测试版本的 Docker 请执行以下命令:
sudo yum-config-manager --enable docker-ce-test
安装 Docker
更新 yum
软件源缓存,并安装 docker-ce
。
sudo yum install docker-ce docker-ce-cli containerd.io
CentOS8 额外设置
由于 CentOS8
防火墙使用了 nftables
,但 Docker
尚未支持 nftables
, 我们可以使用如下设置使用 iptables
:
更改 /etc/firewalld/firewalld.conf
# FirewallBackend=nftables
FirewallBackend=iptables
或者执行如下命令:
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --reload
使用脚本自动安装
在测试或开发环境中 Docker
官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS
系统上可以使用这套脚本安装,另外可以通过 --mirror
选项使用国内源进行安装:
若你想安装测试版的 Docker
, 请从 test.docker.com
获取脚本
curl -fsSL test.docker.com -o get-docker.sh
# or
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
# or
sudo sh get-docker.sh --mirror AzureChinaCloud
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker
的稳定(stable
)版本安装在系统中。
启动 Docker
sudo systemctl enable docker
sudo systemctl start docker
建立 docker 用户组
默认情况下,docker
命令会使用 Unix socket
与 Docker
引擎通讯。而只有 root
用户和 docker
组的用户才可以访问 Docker
引擎的 Unix socket
。出于安全考虑,一般 Linux
系统上不会直接使用 root
用户。因此,更好地做法是将需要使用 docker
的用户加入 docker
用户组。
建立 docker
组:
sudo groupadd docker
将当前用户加入 docker
组:
sudo usermod -aG docker $USER
退出当前终端并重新登录,进行如下测试。
测试 Docker 是否安装正确
docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
若能正常输出以上信息,则说明安装成功。
镜像加速
如果在使用过程中发现拉取 Docker 镜像十分缓慢,可以配置 Docker 国内镜像加速。
添加内核参数
如果在 CentOS
使用Docker
看到下面的这些警告信息:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
请添加内核配置参数以启用这些功能。
sudo tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
然后重新加载 sysctl.conf
即可
sudo sysctl -p
参考文档
rancher 2.x(现在用的是2.7)
rancher概述(具体可查看官网)
官方地址
Rancher 是一个 Kubernetes 管理工具,让你能在任何地方和任何提供商上部署和运行集群。
Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,创建节点并安装 Kubernetes,或者导入在任何地方运行的现有 Kubernetes 集群。
Rancher 基于 Kubernetes 添加了新的功能,包括统一所有集群的身份验证和 RBAC,让系统管理员从一个位置控制全部集群的访问。
此外,Rancher 可以为集群和资源提供更精细的监控和告警,将日志发送到外部提供商,并通过应用商店(Application Catalog)直接集成 Helm。如果你拥有外部 CI/CD 系统,你可以将其与 Rancher 对接。没有的话,你也可以使用 Rancher 提供的 Fleet 自动部署和升级工作负载。
Rancher 是一个 全栈式 的 Kubernetes 容器管理平台,为你提供在任何地方都能成功运行 Kubernetes 的工具。
Rancher 2.x集群销毁及卸载清理
使用docker方式安装的Rancher 2.x集群在执行完后,会在宿主机上生成一些文件。删除镜像时,在执行docker rm rancher时,不会删除生成的文件,会导致重装rancher集群不成功
- web控制台删除集群
可不操作,直接命令行删除容器也行
- 命令行清理rancher相关容器
# 停止
docker stop $(docker ps -q)
# 删除
docker rm $(docker ps -aq)
# 删除容器存储
docker volume rm $(docker volume ls -q)
- 卸载K8s components和secrets
for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher; do umount $mount; done
- 清理残留文件和文件夹
rm -rf /etc/ceph \
/etc/cni \
/etc/kubernetes \
/opt/cni \
/opt/rke \
/run/secrets/kubernetes.io \
/run/calico \
/run/flannel \
/var/lib/calico \
/var/lib/etcd \
/var/lib/cni \
/var/lib/kubelet \
/var/lib/rancher/rke/log \
/var/log/containers \
/var/log/pods \
/var/run/calico
- 重启机器
reboot
安装Rancher
初始化(可跳过)
关闭swap分区
sudo swapoff -a
验证
free -m
确保时区,时间正确
sudo timedatectl
确保虚机不会自动suspend
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
加载内核模块br_netfilter,并调整参数
加载内核模块br_netfilter,并调整参数
执行
sudo modprobe br_netfilter
确认已加载
lsmod | grep br_netfilter
调整内核参数,修改 /etc/sysctl.conf
将桥接的IPv4流量传递到iptables的链
vim /etc/sysctl.conf
cat > /etc/sysctl.conf << EFO
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EFO
使配置生效,执行:
sudo sysctl --system
设置rp_filter的值
执行
sudo vi /etc/sysctl.d/10-network-security.conf
将文件中如下两个参数的值从2修改为1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
使配置生效,执行:
sudo sysctl --system
启动Rancher
安装稳定版的rancher
,具体可查看更多Docker高级选项安装
sudo docker run -d --restart=unless-stopped --privileged --name rancher -p 80:80 -p 443:443 rancher/rancher:stable
或 单节点 注意
在同一个节点中运行 rancher/rancher
和 rancher/rancher-agent
如需使用单个节点运行 Rancher
并将同一个节点添加到集群,你必须调整映射给 rancher/rancher
容器的主机端口。
如果将节点添加到集群中,节点将部署使用端口80
和 443
的 NGINX Ingress Controller
。而这将与我们建议用于暴露 rancher/rancher
容器的默认端口冲突。
请知悉我们不建议将此设置用于生产环境,这种方式仅用来方便进行开发/演示。
如需更改主机端口映射,将-p 10000:80 -p 10443:443
替换为 -p 10000:80 -p 10443:443
,数据储存卷/data/rancher-data:
docker run -d --restart=unless-stopped \
-p 10000:80 -p 10443:443 \
-v /data/rancher-data:/var/lib/rancher \
--privileged \
rancher/rancher:v2.6.12
更新:这里我后期使用了2.6.13版本
在Web界面登录
地址:https:// + ip
例如:https://192.168.20.4
因为是使用https
的方式登录,所以会报错。点继续前往就可以了
如果您预先设置了自己的引导密码,请在这里输入。否则会为您生成一个随机的。
用docker ps
找到你的容器ID
,然后运行:
sudo docker logs container-id 2>&1 | grep "Bootstrap Password:"
- container-id == 你的容器id,要替换的
执行结果,找到container-id
然后继续
填入Bootstrap Password
登录后,设置密码,最少12位,然后继续
至此,Rancher
安装完成!
使用Rancher搭建K8S集群
如果已经搭建k8s
集群,可以选择导入已有集群。
这边我们选择创建
选择在现有的节点上使用RKE
创建集群
输入集群的名称,选择k8s版本,然后根据自己的需求修改其他配置,然后点击Next
登录到节点服务器,服务器上需要装有对应版本的docker
,然后执行复制的命令在主机的 SSH
终端运行。
** 此处注意,是节点服务器执行命令;
这时创建成功等待
然后在首页查看cluster
的状态是否是Active,Active
说明成功了。
如果出现:Cluster health check failed:
可能是服务器没有关闭防火墙
查看防火墙状态
sudo ufw status
关闭防火墙
sudo ufw disable
Rancher的使用
这边以一个web
项目为例子。
Docker
私库使用的是Harbor
,需要将镜像上传到Harbor
中。
创建命名空间
选择一个集群进去
根据自己的项目,来创建命名空间
这边可以使用YAML文件创建,也可以在页面直接输入创建。
Secret
首先创建Harbor
私库的密钥
选择 存储=> Secrets =>创建
选择 仓库
命名空间选择之前自己创建的,填写名称,然后选择 Custom
,仓库地址就是Harbor
的地址,再输入Habor
的用户名和密码。
创建 Deployment
一个 Deployment
为 Pod
和 ReplicaSet
提供声明式的更新能力。
你负责描述 Deployment
中的 目标状态,而Deployment
控制器(Controller
) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment
以创建新的 ReplicaSet
,或删除现有 Deployment
, 并通过新的 Deployment
收养其资源。
以下是 Deployments
的典型用例:
- 创建
Deployment
以将ReplicaSet
上线。ReplicaSet
在后台创建Pod
。 检查ReplicaSet
的上线状态,查看其是否成功。 - 通过更新
Deployment
的PodTemplateSpec
,声明Pod
的新状态 。 新的ReplicaSet
会被创建,Deployment
以受控速率将Pod
从旧ReplicaSet
迁移到新ReplicaSet
。每个新的ReplicaSet
都会更新Deployment
的修订版本。 - 如果
Deployment
的当前状态不稳定,回滚到较早的Deployment
版本。 每次回滚都会更新Deployment
的修订版本。 - 扩大
Deployment
规模以承担更多负载。 暂停Deployment
以应用对PodTemplateSpec
所作的多项修改, 然后恢复其执行以启动新的上线版本。 - 使用
Deployment
状态来判定上线过程是否出现停滞。 - 清理较旧的不再需要的 ReplicaSet 。
使用表单编辑创建Deployment
####
创建一个Deployment后,还会自动创建一个Pod。
这边状态显示为Active,说明创建成功。
Pod
Pod
是可以在 Kubernetes
中创建和管理的、最小的可部署的计算单元。
Pod
(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。Pod
中的内容总是并置(colocated
)的并且一同调度,在共享的上下文中运行。 Pod
所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。
除了应用容器,Pod
还可以包含在 Pod
启动期间运行的 Init
容器。 你也可以在集群支持临时性容器的情况下, 为调试的目的注入临时性容器。
Pod 查看log
Pod
通常不是直接创建的,而是使用工作负载资源创建的。
这边状态显示为Running
,说明正在运行。
Execute Shell
可以进入Pod的容器中,相当于执行命令:kubectl exec -it podName -n namespaceName – /bin/sh
View Logs
查看日志,相当于执行命令:kubectl logs -f --tail 500 podName -n namespaceName
看到启动成功,最终结果访问 ip