检查文件/etc/hostname,确保master和node1的不一样,我这边master的hostname就叫master,node的hostname叫node1;
2.有网服务器执行命令下载:wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.17.tgz
常用命令(搜索、下载本地未有镜像需要联网)
搜索镜像
#docker search 镜像名称
docker search java
下载镜像
#docker pull 镜像名称
docker pull java
查看已下载的镜像
docker images
删除镜像
删除单个镜像:docker rmi 镜像名称
删除所有镜像:docker rmi -f $(docker images)
操作容器
使用docker run命令可新建并启动一个容器,例如使用java镜像启动:docker run java /bin/echo 'Hello World'
其它启动可选附带参数:
-d 选项:表示后台运行
-P 选项:随机端口映射
-p 选项: 指定端口映射,有以下四种模式:
① ip:hostPort:containerPort
② ip::containerPort
③ hostPort:containerPort
④ containerPort
实例测试Nginx容器
docker run --name nginxTest -d -p 91:80 nginx
说明:docker 启动容器时,本地无该容器时会自动从Docker Hup下载引用
-d #后台运行
-p #宿主机端口:容器端口 #开放容器端口到宿主机端口
–name #自定义容器名称
浏览器访问http://服务器ip:91 ,如果出现Nginx主页则表示启动成功。
查看容器状态
查看正在运行容器详情 docker ps
查看所有容器详情 docker ps -a
– CONTAINER ID #容器ID
– IMAGE #镜像
– CREATED #创建时间
– STATUS #状态 Up代表正在运行,Exited 表示已停止运行
– PORTS #端口
– NAMES #容器名称
查看容器日志
格式:docker logs -f -t --tail 行数 容器名 或者 docker logs -f -t --tail 行数 容器ID
docker logs -f -t --tail 200 483a128fdb39
停止容器
docker stop 容器ID 或 docker stop 容器名称
强制停止容器
docker kill 容器ID
启动已停止的容器
docker start 容器ID
重启容器
docker restart 容器ID
进入容器
(1)使用docker attach 命令进行容器,有多窗口操作会同步显示和阻塞问题。
docker attach 容器ID
(2)使用nsenter进入容器
docker inspect --format "{{.State.Pid}}" 容器ID #查询出pid
nsenter --target 查询的pid --mount --uts --ipt --net --pid
(3) 推荐 使用docker exec 命令,该命令在1.3.x版本之后提供。
docker exec -it 容器ID /bin/bash
查看容器详情
docker inspect 容器ID
删除容器
docker rm 容器ID
#该命令不可删除正在运行的容器,要执意删除加-f 参数
打包镜像为离线包
docker save -o 文件名.tar 镜像名称
加载离线镜像包
docker load < 文件名.tar
使用Dockerfile构建Docker镜像
以上面创建的Nginx为例,创建dockerfiler文件
touch Dockerfile
编辑dockerfiler文件
vim Dockerfile
填入以下内容
FROM nginx
WORKDIR
/opt/hello
RUN
echo
'<h1>Hello World!</h1>'
>
/usr/share/nginx/html/index
.html
在Dockerfile所在路径执行以下命令
docker build -t nginx:my .
启动一个docker容器
docker run -d -p 92:80 nginx:my
当然也可指定配置文件路径
docker run -d -p 92:80 -v /u01/hello/config:/opt/hello/config nginx:my
说明:
-d 后台运行,-p 对外暴露端口:内部端口 -v linux文件路径:容器内路径 --name 容器昵称 启动的镜像:版本号
之后只需要在linux 下的/u01/hello/config修改配置,重启容器加载。
浏览器访问http://ip:92 ,可看到“Hello World!”信息。
此时如果用docker pull命令下载镜像,本地会连接hub.docker.com网站去下载,耗时较长,因此我们可以设置docker镜像加速,使得本地连接去国内镜像仓库下载,镜像加速的设置有很多种,本章以阿里云的设置为例,步骤如下:
就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。
Kubernetes 中部署的最小单位是 pod,而不是 Docker 容器。实现上 Kubernetes 是不依赖于 Docker 的,完全可以使用其他的容器引擎在 Kubernetes 管理的集群中替代 Docker。在与 Docker 结合使用时,一个 pod 中可以包含一个或多个 Docker 容器。但除了有紧密耦合的情况下,通常一个 pod 中只有一个容器,这样方便不同的服务各自独立地扩展。
手工搭建 Kubernetes 集群是一件很繁琐的事情,为了简化这些操作,就产生了很多安装配置工具,如 Kubeadm ,Kubespray,RKE 等组件,我最终选择了官方的 Kubeadm 主要是不同的 Kubernetes 版本都有一些差异,Kubeadm 更新与支持的会好一些。Kubeadm 是 Kubernetes 官方提供的快速安装和初始化 Kubernetes 集群的工具,目前的还处于孵化开发状态,跟随 Kubernetes 每个新版本的发布都会同步更新, 强烈建议先看下官方的文档了解下各个组件与对象的作用。
Kubernetes 工作原理:
- 用户可以通过 Kubectl 命令来提交需要运行的 Docker Container 到 K8s 的 APIServer 组件中;
- 接着 APIServer 接收到用户提交的请求后,会将请求存储到 ETCD 这个键值对存储中;
- 然后由 Controller Manager 组件来创建出用户定义的控制器类型(Pod ReplicaSet Deployment DaemonSet 等)
- 然后 Scheduler 组件会对 ETCD 进行扫描,并将用户需要运行的 Docker Container 分配到合适的主机上;
- 最后由 Kubelet 组件来和 Docker 容器进行交互,创建、删除、停止容器等一系列操作。
https://kubernetes.io/docs/concepts/
https://kubernetes.io/docs/setup/independent/install-kubeadm/
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
在创建Kubernetes集群时,阿里云容器服务提供两种网络插件:Terway和Flannel。
Flannel:使用的是简单稳定的社区的Flannel CNI 插件,配合阿里云的VPC的高速网络,能给集群高性能和稳定的容器网络体验,但功能偏简单,支持的特性少,
例如:不支持基于Kubernetes标准的Network Policy。
Terway:是阿里云容器服务自研的网络插件,将阿里云的弹性网卡分配给容器,支持基于Kubernetes标准的NetworkPolicy来定义容器间的访问策略,支持对单个容器做带宽的限流。对于不需要使用Network Policy的用户,可以选择Flannel,其他情况建议选择Terway。
本文主要介绍flannel的简单使用。
组件介绍:
(1)Master组件:
① Etcd:
etcd是一个数据库,它的目标是构建一个高可用的分布式键值数据库,它是基于GO语言实现。在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。在K8s中用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;
② API server:
API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。它提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。
③ Controller Manager:
集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。
④ Scheduler:
集群中的调度器,负责Pod在集群节点中的调度分配。
(2)Node组件:
① Kubelet:
负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。
② Proxy:
实现了Service的代理与软件模式的负载均衡器
其它组件:
- CoreDNS:主要就是用来给 K8s 的 Service 提供一个域名和 IP 的对应解析关系。
- Dashboard:主要就是用来给 K8s 提供一个 B/S 结构的访问体系(即,我们可以通过 Web 界面来对 K8s 进行管理)
- Ingress Controller:主要就是用来实现 HTTP 代理(七层),官方的 Service 仅支持 TCP\UDP 代理(四层)
- Prometheus:主要就是用来给 K8s 提供一个监控能力,使我们能够更加清晰的看到 K8s 相关组件及 Pod 的使用情况。
- ELK:主要就是用来给 K8s 提供一个日志分析平台。
3.1 系统环境
系统 |
k8s版本 |
docker |
ip |
主机名 |
配置 |
centos 7.9 |
1.24 |
20.10.17 |
11.112.20.94 |
k8s-master |
2核4G |
centos 7.9 |
1.24 |
20.10.17 |
11.112.20.95 |
k8s-node01 |
2核4G |
centos 7.9 |
无 |
20.10.17 |
11.112.20.96 |
rancher-master |
2核4G |
注意:请确保CPU至少2核,内存2G
3.2 准备工作
注意:k8s-master,k8s-node01,k8s-node02都必须执行。
3.2.1 关闭防火墙
如果各个主机启用了防火墙,需要开放Kubernetes各个组件所需要的端口,可以查看Installing kubeadm中的”Check required ports”一节。 这里简单起见在各节点禁用防火墙:
# 临时
systemctl stop firewalld
# 永久
systemctl disable firewalld
3.2.2 禁用selinux
# 临时禁用
setenforce 0
# 永久禁用
vim /etc/selinux/config # 或者修改/etc/sysconfig/selinux
SELINUX=disabled
3.2.3 修改k8s.conf文件
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
3.2.4 开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
或
启用IP转发
修改 /etc/sysctl.conf 文件,添加如下行
net.ipv4.ip_forward = 1
使用 sysctl -p命令生效
3.2.5 关闭swap
# 临时关闭
swapoff -a
# 永久
sed -ri 's/.*swap.*/#&/' /etc/fstab
修改 /etc/fstab
文件,注释掉 SWAP 的自动挂载(永久关闭swap,重启后生效)
# 注释掉以下字段
/dev/mapper/cl-swap swap swap defaults 0 0
3.2.6 时间同步
yum install ntpdate -y
ntpdate ntp1.aliyun.com (centos8)
ntpdate time.windows.com (centos7)
3.3 修改主机名
3.3.1 登录k8s-master执行
hostnamectl set-hostname k8s-master
vim /etc/hosts
cat /etc/hosts
注意:主机名不能带下划线,只能带中划线
否则安装k8s会报错
could not convert cfg to an internal cfg: nodeRegistration.name: Invalid value: "k8s_master": a DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')
3.3.2 登录 k8s-node01,rancher-master修改对应主机名
命令格式同上。
3.5 安装kubeadm,kubelet,kubectl
kubeadm是集群部署工具
kubectl是集群管理工具,通过command来管理集群
kubelet的k8s集群每个节点的docker管理服务
kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要 确保它们与通过kubeadm安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与kubelet间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过API服务器的版本。 例如,1.7.0版本的kubelet可以完全兼容1.8.0版本的API服务器,反之则不可以。
官网安装教程:
官网安装教程地址:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
注意:k8s-master,k8s-node01,k8s-node02都必须执行。
在各节点安装kubeadm,kubelet,kubectl
3.5.1 修改yum安装源
添加 kubernetes 阿里云YUM软件源
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
3.5.2 安装软件
目前最新版本是:1.24.3
yum install -y kubelet-1.24.3 kubeadm-1.24.3-0 kubectl-1.24.3-0
设置开机自启动
systemctl enable kubelet && systemctl start kubelet
以上,就是master和node都需要操作的部分。
3.6 离线安装 kubeadm,kubectl,kubelet(方法二)
3.6.1 安装crictl:
软件crictl是kubeadm/kubelet容器运行时接口(CRI)所需的。
软件下载:下载V1.24.3版本的crictl,与k8s版本一致,下载地址为:https://github.com/kubernetes-sigs/cri-tools/releases
软件上传:将下载的crictl软件包上传到服务器的自定义文件夹中。
软件解压:将crictl软件包进行解压。
文件移动:将crictl软件解压的crictl文件移动到/usr/bin中。
3.6.2 获取kubeadm/kubelet/kubectl离线包
在一个有网,并且没安装过k8s的服务器上执行yum命令,将需要的相关rpm格式安装包下载到服务器指定文件夹中,以便在无网服务器中安装:
添加阿里云YUM的软件源:
执行命令:
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
3.6.3下载离线安装包
我们需要把来自kubernetes
源的kubeadm
和4个依赖cri-tools
, kubectl
, kubelet
和kubernetes-cni
拷贝到master和node节点。
创建rpm软件存储目录:
mkdir -p /fairy/soft/kubeadm
执行命令:
yum install -y kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3 --downloadonly --downloaddir /fairy/soft/kubeadm
其它无网服务器需要安装时,将/fairy/soft/kubeadm中的所有rpm文件压缩到一个包中,然后上传到目标服务器,执行下面安装命令即可。
3.6.4 上传kubeadm/kubelet/kubectl离线包
将获取的kubeadm/kubelet/kubectl离线包上传到目标服务器。
3.6.5 执行安装包
进入到kubeadm/kubelet/kubectl离线包的文件夹中,执行如下安装命令:
执行命令:
rpm -ivh *.rpm --force --nodeps
3.6.6 编写kubelet服务脚本
编写kubelet.service服务文件
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
3.6.7 上传服务脚本及授权
将kubelet.service文件上传到服务器/etc/systemd/system/中,并授权:
chmod 777 /etc/systemd/system/kubelet.service
3.6.8 重新加载系统服务
执行命令:
3.6.9 操作kubelet服务
开启自启kubelet服务:
执行命令:
3.7 k8s安装
通过kubeadm搭建k8s集群所需要的相关镜像和软件,与k8s版本有对应的兼容关系,查看不同版本的k8s所需要的镜像和软件版本如下操作:
软件k8s的github地址:https://github.com/kubernetes/kubernetes,
通过CHANGELOG,点击低版本的log,比如:14、15等,搜索:docker version,可以查看到当前k8s版本兼容的docker版本。
3.7.1 初始化Master节点
登录k8s-master执行
3.7.1.1 查看kubeadm版本
yum list kubeadm --showduplicates
3.7.1.2 下载
yum install --downloadonly --downloaddir ~/k8s/kubernetes kubeadm-1.24.3
3.7.1.3 运行初始化命令
kubeadm init
--kubernetes-version=1.24.3\
--apiserver-advertise-address=121.199.31.88\
--image-repository registry.aliyuncs.com/google_containers\
--service-cidr=10.1.0.0/16\
--pod-network-cidr=10.244.0.0/16
注意修改apiserver-advertise-address为master节点ip
参数解释:
–kubernetes-version: 用于指定k8s版本;
–apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16
–service-cidr:用于指定SVC的网络范围;
–image-repository: 指定阿里云镜像仓库地址
这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址
集群初始化成功后返回如下信息:
记录生成的最后部分内容,此内容需要在其它节点加入Kubernetes集群时执行。
输出如下:
...
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 121.199.31.88:6443 --token rkt1p6.3m7z7pqfvaehxmxi \
--discovery-token-ca-cert-hash sha256:dd384c51b5a38cce275dd3e178f6f1601b644f5fc2bc2f8cee9c2b031b119143
注意保持好kubeadm join,后面会用到的。
3.8 离线安装(方法二)
在有网的服务器上下载k8s所需的相关镜像,将对应的镜像导出到服务器指定文件夹中,以便在无网服务器中能够导入镜像,进行使用:
3.8.1 下载k8s镜像
在生产环境,是肯定访问不了k8s.gcr.io这个地址的。在有大陆联网的机器上,也是无法访问的。所以我们需要使用国内镜像先下载下来。
解决办法跟简单,我们也可使用docker命令搜索下
3.8.1.1 查看需要依赖哪些镜像
kubeadm config images list
3.8.1.2 从国内镜像源下载镜像:
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.24.3
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.3
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.3
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.3
docker pull registry.aliyuncs.com/google_containers/pause:3.7
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.6
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.3-0
3.8.2 导出镜像
将修改为官方tag的镜像导入到tar压缩包中,执行命令:
docker save -o kube-proxy-v1.24.3.tar kube-proxy 镜像ID registry.aliyuncs.com/google_containers/kube-proxy:v1.24.3
docker save -o kube-apiserver-v1.24.3.tar kube-apiserver 镜像ID registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.3
docker save -o kube-controller-manager-v1.24.3.tar kube-controller-manager 镜像ID registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.3
docker save -o kube-scheduler-v1.24.3.tar kube-scheduler 镜像ID registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.3
docker save -o pause-3.7.tar pause 镜像ID registry.aliyuncs.com/google_containers/pause:3.7
docker save -o coredns-1.8.6.tar coredns 镜像ID registry.aliyuncs.com/google_containers/coredns:1.8.6
docker save -o etcd-3.5.3-0.tar etcd 镜像ID registry.aliyuncs.com/google_containers/etcd:3.5.3-0
eg:
docker save -o kube-proxy-v1.24.3.tar 2ae1ba6417cb registry.aliyuncs.com/google_containers/kube-proxy:v1.24.3
docker save -o kube-apiserver-v1.24.3.tar d521dd763e2e registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.3
docker save -o kube-controller-manager-v1.24.3.tar 586c112956df registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.3
docker save -o kube-scheduler-v1.24.3.tar 3a5aa3a515f5 registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.3
docker save -o pause-3.7.tar 221177c6082a registry.aliyuncs.com/google_containers/pause:3.7
docker save -o coredns-1.8.6.tar a4ca41631cc7 registry.aliyuncs.com/google_containers/coredns:1.8.6
docker save -o etcd-3.5.3-0.tar aebe758cef4c registry.aliyuncs.com/google_containers/etcd:3.5.3-0
3.8.3 导入镜像
将上述导出的镜像包tar传输到需要的服务器上,然后通过docker命令将镜像包tar导入到docker本地仓库中,命令示例:
docker image load -i 镜像包tar文件名称
3.8.4 检查镜像列表
查看docker本地仓库中的镜像列表,
执行命令:
3.8.5 部署master节点
执行命令:
kubeadm init \
如果使用flannel网络,则要把参数中必须设置--pod-network-cidr=10.244.0.0/16
,这个IP地址是固定的。
如果不用,则不需要
kubeadm init \
--apiserver-advertise-address=121.199.31.88 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.24.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--v=5
参数解释:
–kubernetes-version: 用于指定k8s版本;
–apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16
–service-cidr:用于指定SVC的网络范围;
–image-repository: 指定阿里云镜像仓库地址
3.8.6 查看部署结果
出现如下提示信息,表示k8s的master节点部署好了。
3.8.7 生成kubelet环境配置文件
执行命令:
执行命令:
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
执行命令:
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.8.8 删除主机上train
单机版kubernetes为了运行Pod。需要删除主机上的Train。允许master执行Pod。
执行命令:
kubectl taint nodes --all node-role.kubernetes.io/master-
3.9 安装pod网络插件(CNI)
安装flannel
下载flannel的yml配置文件:
3.9.1 在线下载
mkdir k8s
cd k8s
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果yml中的"Network": "11.244.0.0/16"和kubeadm init xxx --pod-network-cidr不一样,就需要修改成一样的。不然可能会使得Node间Cluster IP不通。
由于我上面的kubeadm init xxx --pod-network-cidr就是11.244.0.0/16。所以此yaml文件就不需要更改了。
3.9.1.1 查看yaml需要的镜像
# cat kube-flannel.yml |grep image|uniq
image: quay.io/coreos/flannel:v0.12.0-amd64
image: quay.io/coreos/flannel:v0.12.0-arm64
image: quay.io/coreos/flannel:v0.12.0-arm
image: quay.io/coreos/flannel:v0.12.0-ppc64le
image: quay.io/coreos/flannel:v0.12.0-s390x
注意:这些镜像都是需要访问谷歌才行的。
3.9.1.2 阿里云容器镜像服务ACR里面是有的
访问链接如下:https://www.aliyun.com/product/acr
注意:必须使用阿里云账号登录才行。
3.9.1.3 点击管理控制台
点击左侧的镜像搜索
3.9.1.4 输入关键字:flannel:v0.12.0-amd64,选择第二个。
3.9.1.5 点击复制公网地址
由于我这里是上海区域,所以域名是:registry.cn-shanghai。如果你选的是其他区域,域名也会不一样。
下面就是我们需要的版本号。
3.9.1.6 下载镜像的完整命令为:
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64
其他镜像,也都在这里。
所以,所需要的镜像下载命令为:
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm64
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-ppc64le
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-s390x
3.9.2 为镜像打tag
保持和yaml文件一样
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm64 quay.io/coreos/flannel:v0.12.0-arm64
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm quay.io/coreos/flannel:v0.12.0-arm
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-ppc64le quay.io/coreos/flannel:v0.12.0-ppc64le
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-s390x quay.io/coreos/flannel:v0.12.0-s390x
注意:这些镜像,也需要在node节点执行。
3.9.3 加载flannel
kubectl apply -f kube-flannel.yml
3.9.4 查看Pod状态
等待几分钟,确保所有的Pod都处于Running状态
# kubectl get pod --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-7ff77c879f-8jpb7 0/1 Running 0 125m 10.244.0.3 k8s-master <none> <none>
kube-system coredns-7ff77c879f-9gcjr 1/1 Running 0 125m 10.244.0.2 k8s-master <none> <none>
kube-system etcd-k8s-master 1/1 Running 0 125m 121.199.31.88 k8s-master <none> <none>
kube-system kube-apiserver-k8s-master 1/1 Running 0 125m 121.199.31.88 k8s-master <none> <none>
kube-system kube-controller-manager-k8s-master 1/1 Running 0 125m 121.199.31.88 k8s-master <none> <none>
kube-system kube-flannel-ds-amd64-gz8jd 1/1 Running 0 27s 121.199.31.88 k8s-master <none> <none>
kube-system kube-proxy-wh548 1/1 Running 0 125m 121.199.31.88 k8s-master <none> <none>
kube-system kube-scheduler-k8s-master 1/1 Running 0 125m 121.199.31.88 k8s-master <none> <none>
注意:coredns容器的网段是10.244.0.0/16
3.9.5 设置开机启动
3.10 flannel离线下载(方法三)
3.10.1 在线flannel的yml文件
地址:https://github.com/caoran/kube-flannel.yml/blob/master/kube-flannel.yml
通过该地址将该yml文件下载下来。
3.10.2 上传yml配置文件
将yml配置文件上传到需要的服务器上。
3.10.3 拉取flannel镜像
执行命令:
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64
3.10.4 重命名flannel镜像:
执行命令:
docker tag flannel镜像ID quay.io/coreos/flannel:v0.12.0-amd64
3.10.5 删除旧flannel镜像:
执行命令:
docker rmi registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64
3.10.6 生效yml配置文件:
在需要的服务器上,进入到yml配置文件所在的文件夹中,
然后执行命令进行生效:
kubectl apply -f kube-flannel.yml
3.11 测试验证k8s
3.11.1 拉取nginx镜像:
手动拉取以下nginx镜像。执行命令:
3.11.2 创建nginx容器:
执行命令:
kubectl create deployment nginx --image=nginx
3.11.3 暴露对外端口:
执行命令:
kubectl expose deployment nginx --port=80 --type=NodePort
3.11.4 查询nginx是否运行成功:
执行命令:
3.11.5 浏览器测试访问:
在与k8s集群通网络段的windows服务器上的浏览器中,输入k8s集群的master或node节点IP及对应nginx映射出的端口号,进行访问,正常的话是可以访问到nginx欢迎页的。
3.11.6 扩展nginx副本:
kubectl scale deployment nginx --replicas=3
3.11.7 查看pod:
通过对nginx进行了扩展副本,然后查看nginx的pod是几个,是否生效,执行命令:
四、node加入集群
4.1 准备工作
请查看上文中的准备工作,确保都执行了!!!
4.1.1 修改主机名部分
改为k8s-node01
hostnamectl set-hostname k8s-node01
4.2 加入节点
登录到node节点,确保已经安装了docker和kubeadm,kubelet,kubectl
kubeadm join 121.199.31.88:6443 --token rkt1p6.3m7z7pqfvaehxmxi \
--discovery-token-ca-cert-hash sha256:dd384c51b5a38cce275dd3e178f6f1601b644f5fc2bc2f8cee9c2b031b119143
设置开机启动
4.3 查看节点
登录k8s-master执行
使用命令查看
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready master 128m v1.24.3 121.199.31.88 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://20.10.17
k8s-node01 Ready <none> 30s v1.24.3 192.168.128.131 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://20.10.17
k8s-node02 NotReady <none> 19s v1.24.3 192.168.128.132 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://20.10.17
登录到node节点,查看ip
# ifconfig
...
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.244.1.0 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 fe80::80e7:9eff:fe5d:3d94 prefixlen 64 scopeid 0x20<link>
ether 82:e7:9e:5d:3d:94 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 8 overruns 0 carrier 0 collisions 0
...
它会创建一个flannel.1网卡,用来做flannel网络通信的。
五、使用yml发布应用
以flaskapp为例子
5.1 登录k8s-master执行
flaskapp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: flaskapp-1
spec:
selector:
matchLabels:
run: flaskapp-1
replicas: 1
template:
metadata:
labels:
run: flaskapp-1
spec:
containers:
- name: flaskapp-1
image: jcdemo/flaskapp
ports:
- containerPort: 5000
flaskapp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: flaskapp-1
labels:
run: flaskapp-1
spec:
type: NodePort
ports:
- port: 5000
name: flaskapp-port
targetPort: 5000
protocol: TCP
nodePort: 30005
selector:
run: flaskapp-1
加载yml文件
kubectl apply -f flaskapp-service.yaml
kubectl apply -f flaskapp-deployment.yaml
查看pod状态
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
flaskapp-1-5d96dbf59b-94v6v 1/1 Running 0 33s 10.244.2.2 k8s-node02 <none> <none>
等待几分钟,确保为Running状态
ping pod ip
# ping 10.244.2.2 -c 3
PING 10.244.2.2 (10.244.2.2) 56(84) bytes of data.
64 bytes from 10.244.2.2: icmp_seq=1 ttl=63 time=1.86 ms
64 bytes from 10.244.2.2: icmp_seq=2 ttl=63 time=0.729 ms
64 bytes from 10.244.2.2: icmp_seq=3 ttl=63 time=1.05 ms
--- 10.244.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.729/1.215/1.862/0.477 ms
确保能正常ping通,表示flannel网络正常。
5.2 访问页面
使用master ip+nodeport访问
http://121.199.31.88:30005/
效果如下:
注意:使用node节点ip+nodeport也可以访问。