Kubernetes简介、集群部署
一、Kubernetes简介
1.kubernetes
- kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
- 它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
- 在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
- 特点
-
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
-
可扩展: 模块化,插件化,可挂载,可组合
-
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
-
2.部署方式的选择
- 传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
- 新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
3.容器部署优势
- 容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”,这更便于监控和管理。
二、Kubernetes集群部署的设备环境
主机 | ip | 服务 | 作用 |
---|---|---|---|
server1 | 172.25.15.1 | docker、haobor仓库 | 搭建网络仓库 |
server2 | 172.25.15.2 | docker、kubelet kubeadm kubectl | 集群节点 |
server3 | 172.25.15.3 | docker、kubelet kubeadm kubectl | 集群节点 |
server4 | 172.25.15.4 | docker、kubelet kubeadm kubectl | 集群master |
三、Kubernetes集群部署步骤
1.关闭交换分区
[root@server2 ~]# swapoff -a
[root@server2 ~]# vim /etc/fstab
[root@server2 ~]# cat /etc/fstab
[root@server3 ~]# swapoff -a
[root@server3 ~]# vim /etc/fstab
[root@server3 ~]# tail -n3 /etc/fstab
[root@server4 ~]# swapoff -a
[root@server4 ~]# vim /etc/fstab
[root@server4 ~]# tail -n3 /etc/fstab
2.systemd
关闭节点的selinux和iptables防火墙
所有节点部署docker引擎
## server2 3 4相同部署
[root@server2 ~]# vim /etc/docker/daemon.json
[root@server2 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors" : ["https://reg.westos.org"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
[root@server2 ~]# systemctl restart docker
[root@server2 ~]# docker info
[root@server2 ~]# scp /etc/docker/daemon.json server3:/etc/docker/
[root@server2 ~]# scp /etc/docker/daemon.json server4:/etc/docker/
[root@server2 ~]# cd /etc/sysctl.d/
[root@server2 sysctl.d]# ls
99-sysctl.conf docker.conf
[root@server2 sysctl.d]# cat docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server2 sysctl.d]# scp docker.conf server3/4 :/etc/system #保证docker 状态正常
3.安装部署k8s仓库
## 相同操作server2 3 4
[root@server2 yum.repos.d]# ls
redhat.repo westos.repo
[root@server2 yum.repos.d]# vim westos.repo
[root@server2 yum.repos.d]# vim k8s.repo
[root@server2 yum.repos.d]# cat k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
[root@server2 yum.repos.d]# yum repolist
## 将仓库配置文件传给server3和server4
[root@server2 yum.repos.d]# scp k8s.repo server3:/etc/yum.repos.d/
k8s.repo 100% 129 157.7KB/s 00:00
[root@server2 yum.repos.d]# scp k8s.repo server4:/etc/yum.repos.d/
k8s.repo 100% 129 147.7KB/s 00:00
## 安装 kubelet kubeadm kubectl
[root@server2 yum.repos.d]# yum install -y kubelet kubeadm kubectl
[root@server2 yum.repos.d]# systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@server2 yum.repos.d]# systemctl enable docker.service
[root@server3 ~]# yum install -y kubelet kubeadm kubectl
[root@server3 ~]# systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@server3 ~]# systemctl enable docker.service
[root@server4 ~]# yum install -y kubelet kubeadm kubectl
[root@server4 ~]# systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@server4 ~]# systemctl enable docker.service
server3和server4安装kubelet kubeadm kubectl
4.拉取镜像并上传到网络仓库
查看默认配置信息
[root@server2 yum.repos.d]# kubeadm config print init-defaults
修改镜像仓库,列出所需镜像
[root@server2 yum.repos.d]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
拉取镜像
[root@server2 yum.repos.d]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
[root@server2 yum.repos.d]# docker images | grep registry.aliyuncs.com
## 将镜像传到haobor仓库
## server2
[root@server2 yum.repos.d]# docker images |grep ^registry.aliyuncs.com | awk '{print $1":"$2}'
## 打标签
[root@server2 yum.repos.d]# docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.3 reg.westos.org/k8s/kube-apiserver:v1.21.3
[root@server2 yum.repos.d]# docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.3 reg.westos.org/k8s/kube-scheduler:v1.21.3
[root@server2 yum.repos.d]# docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.3 reg.westos.org/k8s/kube-controller-manager:v1.21.3
[root@server2 yum.repos.d]# docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.21.3 reg.westos.org/k8s/kube-proxy:v1.21.3
[root@server2 yum.repos.d]# docker tag registry.aliyuncs.com/google_containers/pause:3.4.1 reg.westos.org/k8s/pause:3.4.1
[root@server2 yum.repos.d]# docker tag registry.aliyuncs.com/google_containers/etcd:3.4.13-0 reg.westos.org/k8s/etcd:3.4.13-0
## 导入
[root@server2 yum.repos.d]# docker images |grep reg.westos.org | awk '{print $1":"$2}'
[root@server2 yum.repos.d]# docker push reg.westos.org/k8s/kube-apiserver:v1.21.3
[root@server2 yum.repos.d]# docker push reg.westos.org/k8s/kube-controller-manager:v1.21.3
[root@server2 yum.repos.d]# docker push reg.westos.org/k8s/kube-scheduler:v1.21.3
[root@server2 yum.repos.d]# docker push reg.westos.org/k8s/kube-proxy:v1.21.3
[root@server2 yum.repos.d]# docker push reg.westos.org/k8s/pause:3.4.1
[root@server2 yum.repos.d]# docker push reg.westos.org/k8s/etcd:3.4.13-0
图形创建k8s仓库目录
server2上传
server1 上传coredns/coredns:1.8.0 到仓库
[root@server1 ~]# docker pull coredns/coredns:1.8.0
1.8.0: Pulling from coredns/coredns
c6568d217a00: Pull complete
5984b6d55edf: Downloading [====================================> ]5984b6d55edf: Pull complete
[root@server1 ~]# docker tag coredns/coredns:1.8.0 reg.westos.org/k8s/coredns:v1.8.0
[root@server1 ~]# docker push reg.westos.org/k8s/coredns:v1.8.0
The push refers to repository [reg.westos.org/k8s/coredns]
69ae2fbf419f: Pushed
225df95e717c: Pushed
v1.8.0: digest: sha256:10ecc12177735e5a6fd6fa0127202776128d860ed7ab0341780ddaeb1f6dfe61 size: 739
[root@server1 ~]#
仓库查看
5. 初始化集群
server4做
[root@server4 yum.repos.d]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s
#--pod-network-cidr=10.244.0.0/16使用flannel网络组件时必须添加
[root@server4 docker]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@server4 docker]# cd
[root@server4 ~]# vim .bash_profile
6.安装flanne网络组件
[root@server2 ~]# docker tag flannel:v0.14.0 reg.westos.org/library/flannel:v0.14.0
[root@server2 ~]# docker push reg.westos.org/library/flannel:v0.14.0
[root@server4 ~]# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export KUBECONFIG=/etc/kubernetes/admin.conf #添加
[root@server4 ~]# source .bash_profile
[root@server4 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc #配置kubectl命令补齐功能
[root@server4 ~]# ls
kube-flannel.yml
[root@server4 ~]# vim kube-flannel.yml
[root@server4 ~]# kubectl apply -f kube-flannel.yml
7.各节点join(加入节点)
[root@server3 ~]# kubeadm join 172.25.15.4:6443 --token p4tut6.nzi366cmdb9u7ggp --discovery-token-ca-cert-hash sha256:aa6fcb8ca5e1b146926c4ffc00a0f480e0c086258d0386caf2dfb1d4d1d98edd
[root@server2 ~]# kubeadm join 172.25.15.4:6443 --token p4tut6.nzi366cmdb9u7ggp \
> --discovery-token-ca-cert-hash sha256:aa6fcb8ca5e1b146926c4ffc00a0f480e0c086258d0386caf2dfb1d4d1d98edd
8.查看集群
[root@server4 ~]# kubectl get pod --namespace kube-system
[root@server4 ~]# kubectl get node