kubeadm 安装 k8s 集群
1. 机器准备
部署 k8s 集群的节点按照用途可以划分为如下2类角色:
-
master: 集群的 master 节点,集群的初始化节点,基础配置不低2c 4g
-
slave: 集群的 slave 节点,可以多台,基础配置不低于 1c 2g
这里教程是基于非高可用版本的 k8s 集群,高可用是指有多个 k8s-master 主节点
环境准备
-
准备3台机器,注意配置,别太低,否则跑不起来
-
系统初始化配置,如 ntp 等
主机名,节点ip,部署组件
k8s-master 10.0.0.10 etcd,kube-apiserver,kube-controller-manager,kubectl,kubeadm,kubelet,kube-proxy,flannel,docker
k8s-node1 10.0.0.11 kubectl.kubelet,kube-proxy,flannel,docker
k8s-node2 10.0.0.12 kubectl,kubelet,kube-proxy,flannel,docker
若没主动说明,那就是全节点执行命令
注意: 为确保三台机器,的跨节点的容器互相通信,安装网络插件 flannel
ubuntu系统永久修改主机名 重启系统后确认主机名是否修改成功
查看主机名
root@ubuntu:~# hostname
ubuntu
root@ubuntu:~# uname -n
ubuntu
root@ubuntu:~# cat /etc/hostname
ubuntu
# 修改主机名
root@ubuntu:~# vim /etc/hostname
root@ubuntu:~# cat /etc/hostname
k8s-master-10
root@ubuntu:~#
root@ubuntu:~# hostname
ubuntu
root@ubuntu:~# uname -n
ubuntu
root@ubuntu:~# vim /etc/hostname
root@ubuntu:~# cat /etc/hostname
k8s-node-11
root@ubuntu:~#
root@ubuntu:~# hostname
ubuntu
root@ubuntu:~# uname -n
ubuntu
root@ubuntu:~# vim /etc/hostname
root@ubuntu:~# cat /etc/hostname
k8s-node-12
# 重启系统
root@ubuntu:~# reboot
三台机器环境初始化
root@k8s-master-10:~# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ubuntu
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@k8s-master-10:~#
---------------------------------------------------------
root@k8s-node-11:~# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ubuntu
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@k8s-node-11:~#
---------------------------------------------------------
root@k8s-node-12:~# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ubuntu
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@k8s-node-12:~#
---------------------------------------------------------
cat >> /etc/hosts << 'EOF'
10.0.0.10 K8S-master-10
10.0.0.11 k8s-node-11
10.0.0.12 k8s-node-12
EOF
ping -c 2 k8s-master-10
ping -c 2 k8s-node-11
ping -c 2 k8s-node-12
hosts 解析
cat >>/etc/hosts <<'EOF'
10.0.0.10 K8S-master-10
10.0.0.11 k8s-node-11
10.0.0.12 k8s-node-12
EOF
cat /etc/
ping -c 2 k8s-master-10
ping -c 2 k8s-node-11
ping -c 2 k8s-node-12
调整系统配置
操作节点:所有的 master 和 node 节点(k8s-master,k8s-node)需要执行,
设置安全组开发端口
如果节点间无安全组制(内网机器间可以任意访问),可以忽略,否则,至少保证如下端口可通:
-
k8s-master节点:TCP: 6443.2379,2380,60080,60081 UDP协议端口全部打开
-
k8s-slave节点:UDP协议端口全部打开
设置 iptables 防火墙初始化
systemctl stop firewalld NetworkManager
systemctl disable firewalld NetworkManager
sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
setenforce 0
systemctl disable firewalld && systemctl stop firewalld
getenforce 0
iptables -F
iptables -X
iptables -Z
iptables -P FORWARD ACCEPT
关闭 swap k8s 默认禁用 swap 功能
swapoff -a
# 防止开机自动挂载 swap 分区
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
阿里云源 yum 源配置
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirror.aliyun.com/repo/epel-7.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/*.repo
yum clean all && yum makecache fast
Ubuntu配置阿里云 apt-get 源
1) 查看自己的Ubuntu系统的Codename,这一步很重要,直接导致你更新的源是否对你的系统起效果,查看方法:
# 查看 ubuntu 版本信息
root@k8s-master-10:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.4 LTS
Release: 14.04
Codename: jammy
root@k8s-master-10:~#
2) 确认阿里源支持:
该网页显示了阿里云支持的ubuntu系统下各个Codename版本,确保自己的Codename在该网页中存在(一般都会有的)
ubuntu 14.04 LTS (jammy) 配置如下
4) 添加新的源文件: /etc/apt/sources.list
vim sources.list
并添加以下内容:注意,每一行的jammy应该用第一步查看得到的Codename来代替
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
5) 保存并且sudo apt-get update,更新成功
3) . 备份系统源:打开 /etc/apt/sources.list 添加新的源文件
# 修改sources.list文件
修改之前先备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list-backup
# 使用命令替换URL
改为阿里云的源
sudo sed -i "s@http://.*archive.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list
改为华为云的源
sudo sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
# 更新源命令
sudo apt-get update
sudo apt-get upgrade
# 清理无用的包
sudo apt-get clean && sudo apt-get autoclean
确保 ntp ,网络正确 ntp配置
yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
date
ntpdate -u ntp.aliyun.com
hwclock -w
===========================
hwclock -w #同步 BIOS 时间
ping -c 2 www.yuchaoit.cn # 测试网络
# 修改 chrony 的配置文件 /etc/chrony.conf 加入 ntp.aliyun.com 上游地址即可
server ntp.aliyun.com iburst
# 主动同步时间
ntpdate -u ntp.aliyun.com
# 时间同步到硬件
hwclock -w
修改内核参数
修改 linux 内核参数,开启数据包转发功能
# 容器跨主机通信,底层是走的 iptables,内核级别的数据包转发
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
vm.max_map_count=262144
EOF
modprobe br_netfilter
# 加载读取内核参数配置文件
sysctl -p /etc/sysctl.d/k8s.conf
各节点需要安装的软件
# k8s kubeadm 一键自动化,安装k8s集群,安装所有运行需要的组件
root@k8s-master-10:~#
# 主节点安装如下软件
etcd,kube-apiserver,kube-controller-manager,kubectl,kubeadm,kubelet,kube-proxy,flannel,docker
root@k8s-node-11:~#
# 从节点安装如下软件
kubectl.kubelet,kube-proxy,flannel,docker
root@k8s-node-12:~#
# 从节点安装如下软件
kubectl.kubelet,kube-proxy,flannel,docker
注意: 为确保三台机器,的跨节点的容器互相通信,安装网络插件 flannel
2. 安装 k8s 的方式
k8s 安装方式有很多,只关注生产下玩法,用 kubeadm 安装即可
不同公司方案不一
- 二进制安装
- ansible -> rpm. kubeadm 初始化集群
- rancher 工具
- 阿里云 ACK
学废了
先装起来这个 k8s 环境
先学会怎么用
一周之后,组件怎么用,如何部署应用
基本玩明白之后
- 1.看原理
-2.深入学习,安装方式
kubeadm
为了更深入理解每一个组件的通信关系
再深入二进制部署等
3. kubeadm 工具
kubeadm 是 Kubernetes 主推的部署工具之一,将 k8s 的组件打包为了镜像,然后通过 kubeadm 进行集群初始化创建。
所有节点操作
安装 docker基础环境 三台机器环境初始化
vim init.docker.sh
bash init.docker.sh
配置阿里源 https://developer.aliyun.com/mirror/
如果是ECS配置阿里云源用 http://mirrors.aliyun.com/
其他配置阿里云源用 https://mirrors.aliyun.com/
========================================================================
vim init.docker.sh
yum remove docker docker-common docker-selinux docker-engine -y
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum list docker-ce --showduplicates
yum install docker-ce-19.03.15 docker-ce-cli-19.03.15 -y
# 配置 docker 加速器,以及 cgroup 驱动,改为 k8s 官方推荐的 systemd ,否则初始化时会有报错。
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors" : [
"https://2j2z9k9u.mirror.aliyuncs.com"],
"exec-opts" : ["native.cgroupdriver=systemd"]
}
EOF
# 启动
systemctl start docker && systemctl enable docker
docker version
=============================================================
官网: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
# 安装docker 阿里云官方案例如下
1. 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce
2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://2j2z9k9u.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
============================================================
[root@k8s-master-10 ~]# bash init.docker.sh
[root@k8s-master-10 ~]# docker info | grep -i cgroup
Cgroup Driver: systemd
分别安装 kubeadm 集群初始化工具,在所有节点执行
node节点,加入集群即可
安装 k8s 的初始化工具 kubeadm 命令(所有节点执行)
# 安装 k8s 集群环境初始化工具 # k8s 版本 1.19.3
# kubelet-1.19.3 # 组件,增删改查 pod 再具体机器上 pod 可以运行在主节点上,也可以运行在 node 节点
# kubeadm-1.19.3 # 自动拉取 k8s 基础组件镜像的一个工具
# kubectl-1.19.3 # 管理维护 k8s 客户端和服务端交互的一个命令行工具
所有机器初始化执行
安装 k8s 的初始化工具 kubeadm 命令(所有节点执行)
写成初始化脚本 vim init.k8s.sh
# 设置阿里云源
curl -o /etc/yum.repos.d/Centos-7.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
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=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
yum clean all && yum makecache
# yum list kuberadm --showduplicates 列出,这个阿里云 k8s 源,提供了哪些 k8s 版本让你玩
# 安装指定版本 kubeadm-1.19.3 ,安装的 kubeadm 版本,就是决定了拉取什么版本的 k8s 集群版本的镜像
yum install kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3 ipvsadm -y
=========================================================
bash init.k8s.sh
代码解释
# yum list kuberadm --showduplicates 列出,这个阿里云 k8s 源,提供了哪些 k8s 版本让你玩
# 安装指定版本 kubeadm-1.19.3 ,安装的 kubeadm 版本,就是决定了拉取什么版本的 k8s 集群版本的镜像
yum install kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3 ipvsadm -y
以上表示列出 kubeadm 所有版本
你想让 k8s 安装什么版本,只需要修改 kubeadm 组件的版本号就可以了
注意: k8s集群 必须保证所有节点都安装 docker 服务端,kubelet 服务端
k8s 安装完毕之后,设置所有节点的 docker 和 kubelet 开机运行
为什么要 kubelet ,docker 开机自启动
1. k8s-master 服务器机器开机后,所有组件运行,etcd 存储所有 pod 的信息,通知给 api-server,通知给具体的目标节点,告诉节点该运行 pod 了等
2.kubelet 和 k8s-master 通信,确认对当前机器 pod 状态 维护以及更新, node机器跑起来,有哪些 pod 要运行,都是 api-server 和 kubelet 在通信,docker 也同理,所以要确保你 kubelet 程序, docker 程序都是开机自启动。
注意: k8s集群 必须保证所有节点都安装 docker 服务端,kubelet 服务端
设置 kubelet ,docker 开机启动
kubelet该工具用于建立起 k8s 集群,master,node 之间的联系。
执行 kubeadm version 确认已经安装好了
ps -ef | grep kubelet
## 查看 kubeadm 版本, 初始化的 k8s 版本信息,就是 v1.19.3 版本
kubeadm version
[root@k8s-master-10 ~]# kubeadm version
kubeadm version: &version.Info{Major: "1", Minor: "19", GitVersion: "v1.19.3", GitCommit: "1e11e4a2108024935ecfcb2912226cedeafd99df",GitTreeState: "clean",BuildDate:"2020-10-14T12:47:53Z",Go}
## 设置 kubelet docker 开机自启动
systemctl enable kubelet
systemctl enable docker
====================================
[root@k8s-master-10 ~]# kubeadm version
[root@k8s-master-10 ~]# ps -ef | grep kubelet
先保留所有节点的应用端口状态,待会看 k8s 跑起来之后,占用了哪些端口,知道哪些程序运行了
[root@k8s-master-10 ~]#
[root@k8s-master-10 ~]# netstat -tunlp
初始化 k8s-master 主节点(只在主节点执行)
初始化集群
kubeadm init \
--apiserver-advertise-address=10.0.0.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU
# 参数解释
API-Server 地址
镜像仓库地址
k8s 版本
clusterIP
podIP网段
集群内 dns 后缀
忽略 swap 报错
代码解释
# 初始化,加入一些参数
kubeadm init \
# api-server 运行在 k8s-master 的 IP 上
--apiserver-advertise-address=10.0.0.10 \
# 拉取 k8s 镜像,从阿里云上获取,否则默认是国外的 k8s 镜像地址,下载不了。
--image-repository registry.aliyuncs.com/google_containers \
# 和 kubeadm 版本保存一致
--kubernetes-version v1.19.3 \
# k8s 服务发现网段设置,service网段
--service-cidr=10.1.0.0/16 \
# 设置 pod 创建后的运行网段地址(pod 拿到的IP地址是 10.2.0.0/16 中的任意一个)
--pod-network-cidr=10.2.0.0/16 \
# k8s 服务发现网段设置,service资源的域名后缀
--service-dns-domain=cluster.local \
# 忽略 Swap 报错
--ignore-preflight-errors=Swap \
# 忽略 CPU 数量报错
--ignore-preflight-errors=NumCPU
# k8s-master 初始化过程讲解
初始化的过程,等待,等的就是镜像拉取的时间
# 1.下载组件镜像
kube-proxy
kube-scheduler
kube-apiserver 应用程序 做好了镜像 下载
# 2. 以容器的形式运行每一个组件就行
# 3. 如何查看到 kubeadm 拉取了哪些镜像?
docker images
# 中间的组件创建过程,以及ssl证书创建过程,暂时不用看,以后回过头再看
# 你的k8s控制平面已经成功安装了
your kubernetes control-plane has initialized successfully!
#为了开始使用集群,你需要设置如下信息
To start using your cluster,you need to run the following as a regular user;
# 创建 k8s 集群配置文件
# 制定了,默认的 ssl 证书在哪,api-server的地址,等
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
把以上三行命令在 k8s-master节点执行
==========================================================
# 你需要部署一个 pod 网络去设置集群
# pod 分布在多个机器上,pod 互相之间链接,得部署,集群网络,会选用 flannel 网络插件
# 安装,使用即可
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/
# 使用如下命令,将 k8s-node 加入集群即可,
Then you can join any number of worker nodes by running the following on each as root;
===================================================================
查看网络命令:netstat -tunlp
# 6443 是 api-server 入口的端口 'token' 密码校验
# 下面这条命令在 node 节点执行,让 k8s-master 与 k8s-node 节点建立联系
# 添加到集群中
kubeadm join 10.0.0.10:6443 --token vf7bng.p01kay3nygloh561 \
--discovery-token-ca-cert-hash
sha256:.........
===================================================================
以上是 k8s-master 初始化结果讲解
初始化过程会去阿里云下载镜像,最终的初始化结果务必保留好
k8s-master 运行的组件查看,控制平面(官网说法)查看
3723/kubelet # 调度 pod 的=
1037/kube-proxy # 自动根据应用部署逻辑生成 iptables
3421/etcd # 存储 k8s 所有资源的信息的
3419/kube-controlle # 控制器过管理器,管理 pod 部署的类型
3417/kube-scheduler # 决定 pod 部署到哪个机器上的
3386/kube-apiserver # 集群的一个访问入口
以上构建了一个 k8s 主节点
此时主节点就可以用了
# 查看 k8s 集群状态,查看有哪些工作节点
# 客户端命令: 可以直接和 api-server 交互,查询你要的信息
# 查看有哪些工作节点
kubectl get nodes
# 这个命令,默认会去加载 ssl 证书,确保安全
# 以后再聊, kubectl 的证书添加参数
# 在主节点上使用这个命令是可以直接用的
# 显示更详细的信息
kubectl get nodes -o wide
# 下一步该干嘛了?
1. 配置网络,让集群就绪
2.加入多个 node 节点进来。
加入 k8s-node 到集群中
# 只需要用上述的一个集群命令添加即可
# 添加到集群中 以下命令在两个 node 节点上执行即可
kubeadm join 10.0.0.10:6443 --token vf7bng.p01kay3nygloh561 \
--discovery-token-ca-cert-hash
sha256:.........
kubelet-start
表示 node 节点,还没有 kubelet 进程,和 master 通信
这个 kubeadm.json 就是运行 kubelet 进程,和主节点通信的。
k8s 提示你可以用 kubectl get nodes 命令再控制台平面上,去查看 node 节点的信息?
在哪里执行,在 k8s-master 主节点执行
在 node 节点 执行 netstat -tunlp
此时 node 机器就可以和 master 机器 通信了,走 kubelet 进程
kubelet该进程是以什么形式运行的?
不是以容器形式运行的 而是宿主机直接,以 1 号进程, systemd 去启动的 kubelet 进程。
ps -ef | grep 13018
/usr/bin/kubelet 在宿主机 的 1 号进程跑起来了
systemctl status kubelet 查看
如何查看?
docker ps
# k8s-master 主节点查看所有工作节点信息 查看 k8s 集群用到哪些机器
kubectl get nodes -o wide
如何让集群就绪呢?部署网络插件
部署 Flannel 网络插件(master)
前面于超老师已经讲解了 docker 跨主机网络通信方案,Flannel 的架构 k8s 这里依然采用该网络模式
下载 flannel
git clone --depth 1 https://github.com/coreos/flannel.git
修改网络插件信息
修改自定义的 PODIP 网段,你也可以选择不改
第一处,指定 flannel 创建的局域网段
net-conf.json:
{
"Network": "10.2.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
第二处,#如果机器存在多网卡的话,指定内网网卡的名称,默认不指定的话会找第一块网卡
containers:
-name: kube-flannel
#image: flannelcni/flannel: v0.19.2 for ppc64le and mips64le (dockerhub limitations may app)
image: docker.io/rancher/mirrored-flannelcni-flannel: v0.19.2
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
- --iface=ens33
应用 yaml 清单创建 flannel
# 过程是创建 pod,创建容器
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl create -f kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
# 创建的这些资源都是可以查看的
# 往后慢慢学
# flannel 这种网络插件,以 Daemonset 控制器去运行 pod ,确保在主机上只有一个。
# 检查关于 flannel 的容器信息
kubectl get pods -n kube-flannel
如何让集群就绪呢?部署网络插件
# 1. 下载网络插件,配置文件, yaml 以及配置文件
git clone --depth 1 https://github.com/coreos/flannel.git
# 2. 再 k8s 主节点上,应用这个 yaml,基于 yaml,创建具体的 pod 过程。
# 3. 如果需要修改 pod 运行网络的话,要改配置文件,配置文件的绝对路径如下
/root/flannel-master/Documentation/kube-flannel.yml
# 创建 k8s 资源,都是写这种 yml 文件了
[root@k8s-master-10 ~/flannel-master/Documentation]# vim kube-flannel.yml
set nu
/Network
[root@k8s-master-10 ~/flannel-master/Documentation]# grep "Network" -A 5 kube-flannel.yml
net.conf.json:
{
"network": "10.2.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
# 修改第二处 跨主机的容器通信,最终不得走宿主机的物理网卡。
# 得告诉 flannel 的物理网卡是谁
[root@k8s-master-10 ~/flannel-master/Documentation]# vim kube-flannel.yml
containers
-name kube-flannel
image docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2
command
- /opt/bin/flanneld
args #这个 flannel 网络插件,以容器形式,运行再 master 节点上,以及设置运行参数
- --ip-masq
- --kube-subnet-mgr
- --iface=ens33
iface 该设定使用的网络接口;这个路由传递封包的介面;该设定使用的网络接口为何
# 基于 kubectl 命令,应用这个 yml 文件,读取,以及创建 pod 资源
[root@k8s-master-10 ~/flannel-master/Documentation]# docker ps # 查看容器情况
[root@k8s-master-10 ~/flannel-master/Documentation]# docker ps | grep flannel
[root@k8s-master-10 ~/flannel-master/Documentation]#
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl
在 github.com 官网 上下载 flannel-master_1.zip 然后上传到服务器
解压 unzip flannel-master_1.zip
[root@k8s-master-10 ~]# ls
anaconda-ks.cfg flannel-master flannel-master_(1).zip init2.sh init-docker.sh init-k8s.sh init.sh
[root@k8s-master-10 ~]# cd flannel-master/
[root@k8s-master-10 ~/flannel-master]# ls
backend code-of-conduct.md dist Dockerfile.arm64 Dockerfile.s390x go.sum LICENSE Makefile OWNERS README.md version bill-of-masterials.json CONIRIBUTING.md Dockerfile.amd64 Dockerfile.mips64le Documentation header-check.sh logos network packet-01.png subnet bill-of-masterials.override.json DCO Dockerfile.arm Dockerfile.ppc64le go.mod images main.go NOTICE pkg vendor
# 修改 pod 网络的网段地址,根据 kubeadm init 初始化时,设置的地址来
[root@k8s-master-10 ~/flannel-master/Documentation]# pwd
/root/flannel-master/Documentation/
[root@k8s-master-10 ~/flannel-master/Documentation]# ls
alicloud-vpc-backend-cn.md alicloud-vpc-backend.md aws-vpc-backend.md backends.md building.md configuration.md extension.md gce-backend.md img integrations.md k8s-manifests kube-flannel-aliyun.yml kube-flannel-old.yaml kube-flannel-psr.yml kube-flannel.yml kubernetes.md minikube.yml production-users.md reporting_bugs.md reseryations.md running.md tencentcloud-vpc-backend.md troubleshooting.md upgrade.md
kubectl create
kubectl create --
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl create -f ./kube-flannel.yml
namespace/kube-flannel created
clusterrole_rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
# 查看当前机器的容器,关于 flannel 网络插件的进程
[root@k8s-master-10 ~/flannel-master/Documentation]# docker ps | grep flannel
# 代码解释
'kubectl create -f ./kube-flannel.yml' 该命令在 k8s-master 主节点执行
# k8s-master 主节点
flannel 网络插件的应用信息 ,这些信息会同步到 kubelet,kubelet知道了,你要创建一个 flannel,在每个节点上都运行,因此 在 k8s-node 节点上也运行了一个 pod flannel ,flannel是以容器的形式云吸猫的
1.api-server 我要创建一下资源,
2. etcd接收到这些信息,etcd 存储了关于 flannel 插件的信息 部署逻辑上是在每个节点上都只能运行一个
# k8s-node 节点
kubelet 进程,一直监听 ETCD 数据库的变化 ,当 kubelet 接收到 你要创建一个 flannel,在每个节点上都运行,因此 k8s-node 也运行一个 pod flannel 容器
总结: 以上阐述,你在 k8s-master 节点上安装 flannel 插件,在 k8s-node 节点上也能看到的 pod flannel 容器的原理逻辑
[root@k8s-master-10 ~/flannel-master/Documentation]#
为什么所有进程都有了网络插件 flannel 进程
# 查看当前机器的容器,关于 flannel 网络插件的进程
[root@k8s-master-10 ~/flannel-master/Documentation]# docker ps | grep flannel
# 代码解释
'kubectl create -f ./kube-flannel.yml' 该命令在 k8s-master 主节点执行
# k8s-master 主节点
flannel 网络插件的应用信息 ,这些信息会同步到 kubelet,kubelet知道了,你要创建一个 flannel,在每个节点上都运行,因此 在 k8s-node 节点上也运行了一个 pod flannel ,flannel是以容器的形式云吸猫的
1.api-server 我要创建一下资源,
2. etcd接收到这些信息,etcd 存储了关于 flannel 插件的信息 部署逻辑上是在每个节点上都只能运行一个
# k8s-node 节点
kubelet 进程,一直监听 ETCD 数据库的变化 ,当 kubelet 接收到 你要创建一个 flannel,在每个节点上都运行,因此 k8s-node 也运行一个 pod flannel 容器
总结: 以上阐述,你在 k8s-master 节点上安装 flannel 插件,在 k8s-node 节点上也能看到的 pod flannel 容器的原理逻辑
# 查看所有集群状态的命令
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl get nodes
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl get nodes -o wide
总结: 至此表示,3个节点,集群通信 ok 了, 现在就可以部署应用了
至此,所有机器,都走 flannel 进行集群通信了
确保集群所有节点,就绪状态
# 查看所有集群状态的命令
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl get nodes
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl get nodes -o wide
至此表示,3个节点,集群通信 ok 了, 现在就可以部署应用了
配置 k8s 命令补全(重要)
k8s 命令太多,务必要配置 k8s 命令补全
操作节点:k8s-master
yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
发出 pod 创建请求,运行一个 nginx-pod
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl run --image tab
# 查看命令帮助 kubectl run --help
# 后台运行一个 nginx-1.14.1 pod
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl run linux0224-pod-1-nginx --image=nginx-1.14.1
pod/linux0244-pod-1-nginx created
# 如何查看 pod 信息 kubectl get tab键
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl get pods -o wide
# pod b部署在子 k8s-node-11 机器上,以什么形式容器运行 可以在 k8s-node-11 机器上看到 刚才创建的容器
命令: docker ps 在 k8s-node-11 机器上执行该命令就可以看到 linux0224-pod-1-nginx 容器
访问 pod-ip 即可
pod 的 ip 是 k8s 集群内,才能访问通的一个 ip ,无法在外部访问,外部访问得设置更多网络规则。
[root@k8s-master-10 ~/flannel-master/Documentation]# curl 10.2.2.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma,Verdana,Arial,sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page,the nginx web server is successfully installed and working.Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@k8s-master-10 ~/flannel-master/Documentation]# curl 10.2.2.2 -I
HTTP/1.1 200 OK
Server: nginx/1.14.1
Date: Tue,13 Sep 2022 05:59:51 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 06 Nov 2018 13:28:31 GMT
Connection: keep-alive
ETag: "5bel96ff-264"
Accept-Ranges: bytes
如何修改这个 index.html 页面
你会修改吗?
# 1. 直接修改容器信息 具体机器上,的集群 容器进程
[root@k8s-node-11 ~]# docker exec 容器ID sh -c "echo '<meta charset-utf8> 同志们辛苦了。' > /usr/share/nginx/html/index.html"
[root@k8s-master-10 ~/flannel-master/Documentation]# curl 10.2.2.2
<meta charset-utf8> 同志们辛苦了。
# 先进入容器
[root@k8s-node-11 ~]# docker exec -it 容器ID
# 2. 容器集群,走管理节点去管理 pod,再去修改,容器信息,让你明白,pod 和容器的关系。
# 基于 k8s 命令,修改 pod 内的容器信息,以及帮助信息查看
kubectl exec mypod --data
[root@k8s-master-10 ~/flannel-master/Documentation]# kubectl exec linux0224-pod-1-nginx --sh -c "echo '<meta charset-utf8> 同志们辛苦了。散会,好好休息一会' >> /usr/share/nginx/html/index.html"
[root@k8s-master-10 ~/flannel-master/Documentation]# curl 10.2.2.2
<meta charset-utf8> 同志们辛苦了。
<meta charset-utf8> 同志们辛苦了。散会,好好休息一会
登录远程服务器在命令行终端输入
# ssh登录
# 登录远程服务器基本用法:ssh user@hostname
1.user: 用户名
2.hostname: IP地址或域名
比如:
ssh root@192.168.1.18
# 配置文件 创建文件 ~/.ssh/config 可以使用别名登录
Host myserver1
HostName IP地址或者域名
User 用户名
Host myserver2
HostName IP地址或者域名
User 用户名
Host myserver3
HostName IP地址或者域名
User 用户名
之后再使用服务器时,可以直接使用别名 myserver1,myserver2,myserver3 就可以登录了
实操:
# 创建别名登录远程服务器
mkdir .ssh/
touch .ssh/config
vim .ssh/config
k8s 资源清单
再安装好 k8s 之后,本章开始学习 k8s 的具体使用玩法。
重点介绍如何使用 workload 管理业务应用的生命周期,实现服务不中断的滚动更新,通过服务发现和集群内负载均衡来实现集群。。。
学习过程中会逐步对 Django 项目做 k8s 改造,从零开始编写所需的资源文件。
通过本章的学习,学员会掌握高可用 k8s 集群的搭建,同时 Django demo 项目已经可以利用 k8s 的控制器,服务发现,负载均衡,。。。。
前面也说过,纯容器化部署的问题。
业务容器数量庞大,哪些容器部署在哪些节点,使用了哪些端口,如何记录,管理,需要登录到每台机器去管理?
跨主机通信,多个机器中的容器之间相互调用如何做,iptables 规则手动维护?
跨主机容器间互相调用,配置如何写?写死固定 IP + 端口?
如何实现业务高可用?多个容器对外提供服务如何实现负载均衡?
容器业务中断了,如何可以感知到,感知到以后,如何实现自动启动新的容器?
如何实现滚动升级保证业务的连续性?
。。。。。。
因此就得引入容器管理平台,k8s 是目前主流的平台工具。