kubernetes 集群安装与部署

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-dists安装包下载_开源镜像站-阿里云

该网页显示了阿里云支持的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 是目前主流的平台工具。

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值