kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源 的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的 应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种 机制。传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配 置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等 操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于 可移植性。 新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件 系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署, 由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进 行迁移。容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间 成一对一关系也使容器有更大优势,使用容器可以在 build 或 release 的阶段,为应用创 建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构, 这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”, 这更便于监控和管理。 Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、 应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便 对应用请求进行负载均衡。 在 Kubernetes 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通 过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需 要运维人员去进行复杂的手工配置和处理。
master (主控节点)和node (工作节点)
master有四个
node有两个
- master组件
- apiserver
集群统一入口,以restful方式,交给etcd存储- schedulcr
节点调度,选择node节点应用部署- controller-maTageI
处理集群中常规后台任务。—个资源对应—个控制器- etcd
存储系统,用于保存集群相关的数据
- node组件
- kubeelet
master排到node节点代表,管理本机容器- kube-proxy
提供网络代理,负载均衡等操作
1、Pod
最小部署单元
—组容器的集合
共享网络
生命周期是短暂的
2、controller
确保预期的pod副本数量
无状态应用部署
有状态应用部署
确保所有的node运行同一个pod
一次性任务和定时任务
3、Service
定义一组pod的访间规则
(1)kubeadm :
- Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部 署 Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/(2)二进制:
- 二进制包 从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。 Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可 控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很 多工作原理,也利于后期维护
- 安装要求
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止 swap 分区
- 最终目标
- (1) 在所有节点上安装 Docker 和 kubeadm
- (2)部署 Kubernetes Master
- (3)部署容器网络插件
- (4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中
- (5)部署 Dashboard Web 页面,可视化查看 Kubernetes 资源
k8s-master 10.0.0.11
k8s-node1 10.0.0.12
k8s-node2 10.0.0.13
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
关闭 swap:
临时swapoff -a
永久
vim /etc/fstab
or
sed -ri 's/.*swap.*/#&/' /etc/fstab
cat >> /etc/hosts << EOF 10.0.0.11 k8s-master 10.0.0.12 k8s-node1 10.0.0.13 k8s-node2 EOF
echo 'net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1' > /etc/sysctl.d/k8s.conf
生效:
sysctl --system
yum install ntpdate -y ntpdate time.windows.com
一. 所有节点安装 Docker/kubeadm/kubelet
- Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
- 安装 Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce-18.06.1.ce-3.el7 systemctl enable docker && systemctl start docker docker --version
- 添加阿里云 YUM 软件源 设置仓库地址
cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF
重启:
systemctl restart docker.service
- 添加 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
- 由于版本更新频繁,这里指定版本号部署∶
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubect1-1.18.0
systemctl enable kubelet
- 在 10.0.0.11(Master)执行
- 拉取镜像
kubeadm init \ --apiserver-advertise-address=10.0.0.11 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.18.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16
- 使用kubectl工具创建环境∶以下代码在如上图 1处
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 查看集群
$ kubectl get nodes
在10.0.0.12/13 ( Node )执行。
- 向集群添加新节点,以下代码如上图(2)处
kubeadm join 10.0.0.11:6443 --token 80rwqa.xlh30tmkapc2op78 \ --discovery-token-ca-cert-hash sha256:6c8a7931d64a44dd3c1bd9f5eb5d54b63f3ba07ad083ec889371eb30c4c99504
- 默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新>创建token,操作如下:
kubeadm token create --print-join-command
- 安装网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl get nodes
$ kubectl create deployment nginx --image=nginx $ kubectl expose deployment nginx --port=80 --type=NodePort
用pod的svc可以看到分配的30908随机端口
$ kubectl get pod,svc
然后通过任意node节点ip加端口访问,出现nginx欢迎界面就成功了
http://10.0.0.12:30908/
http://10.0.0.13:30908/
准备环境
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
cat >> /etc/hosts << EOF
10.0.0.21 k8s-master
10.0.0.22 k8s-node1
EOF
yum -y install ipvsadm ipset sysstat conntrack libseccomp
cat >> /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
准备docker安装包
containerd.io-1.6.4-3.1.el7.x86_64.rpm
docker-ce-cli-20.10.9-3.el7.x86_64.rpm
container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm
docker-ce-rootless-extras-20.10.9-3.el7.x86_64.rpm
docker-ce-20.10.9-3.el7.x86_64.rpm
docker-scan-plugin-0.9.0-3.el7.x86_64.rpm
yum install *.rpm
systemctl enable docker && systemctl start docker
准备k8s安装包
07f7583cfe98238a882f1bb1182a6f356177a8d99a4439b8df019b97e57accc4-kubeadm-1.20.14-0.x86_64.rpm
09c4223a0bdb890ea6ee283bd5fb760f00652acd9f7f212736f59da8b6f8f1d1-kubelet-1.20.14-0.x86_64.rpm
81c8757b7bc56c9df9a04d7f0ad8733391138b45502881b465aed620e2f1ebfc-kubectl-1.20.14-0.x86_64.rpm
db7cb5cb0b3f6875f54d10f02e625573988e3e91fd4fc5eef0b1876bb18604ad-kubernetes-cni-0.8.7-0.x86_64.rpm
rpm -ivh *.rpm --nodeps
systemctl enable kubelet.service
准备镜像
coredns.tar
etcd.tar
kube-apiserver.tar
kube-controller-manager.tar
kube-proxy.tar
kube-scheduler.tar
mirrored-flannelcni-flannel-cni-plugin.tar
mirrored-flannelcni-flannel.tar
pause.tar
cd InstallPackages/k8s/images/
for i in `ls`;do docker image load -i $i;done
初始化
kubeadm init \
--apiserver-advertise-address=10.0.0.21 \
--kubernetes-version=v1.20.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
kubeadm reset
rm -rf $HOME/.kube
准备网络插件
kubectl apply -f kube-flannel.yml
kubectl apply -f