开源容器应用自动化部署技术Kubernetes
Kubernetes这个单词来自于希腊语,含义是 舵手 或 领航员;
生产环境级别的容器编排
编排是什么意思
1. 按照一定的目的依次排列;
2. 调配、安排;
Kubernetes,也称为K8S,其中8是代表中间“ubernete”的8个字符,是Google在2014年开源的一个容器编排引擎,用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便于管理和发现,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,很多细节都不需要运维人员去进行复杂的手工配置和处理;
Kubernetes拥有Google在生产环境上borg 15年运行的经验,并结合了社区中最佳实践;
K8S是 CNCF 的项目,本来Kubernetes是Google的内部项目,后来开源出来,又后来为了其茁壮成长,捐给了CNCF;
CNCF全称Cloud Native Computing Foundation(云原生计算基金会)
中文社区:https://www.kubernetes.org.cn/k8s
代码:https://github.com/kubernetes/kubernetes
Kubernetes是采用Go语言开发的,Go语言是谷歌2009发布的一款开源编程语言;
Kubernetes整体架构
master--nodes
Master:
k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成;
Nodes:
集群工作节点,运行用户业务应用容器;
Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime);
============================
部署 Kubernetes 环境(集群)
主要有多种方式:
(1)minikube
minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作;
https://kubernetes.io/docs/tutorials/hello-minikube/
(2)kind
Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;
(3)kubeadm
Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;
官方地址:
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
(4)二进制包
从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;
(5)yum安装
通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;
(6)第三方工具
有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;
(7)花钱购买
直接购买类似阿里云这样的公有云平台k8s,一键搞定;
============================
Kubeadm部署k8s集群
默认各节点都已经正确安装`docker-ce:19.03.10`,并且都已经正常配置docker加速器。
## 基本环境准备
| Linux版本 | CPU | MEM |
| --------- | ---- | ------- |
| CentOS7.8 | 双核 | 4G/node |
| master | node01 | node02 |
| ------------ | ------------ | ------------ |
| 192.168.8.10 | 192.168.8.20 | 192.168.8.30 |
### 更改主机名 hostnamectl set-hostname master hostnamectl set-hostname node01 hostnamectl set-hostname node02 ### 添加对应域名解析 cat >> /etc/hosts << EOF 192.168.8.10 master 192.168.8.20 node01 192.168.8.30 node02 EOF ### 防火墙,SElinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config ### 时间同步 timedatectl set-timezone Asia/Shanghai;timedatectl set-local-rtc 0 ### 禁用swap swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab free -h 查看禁用效果 ### 配置集群无密登录 master到node01,node02无密码 ssh-keygen -t rsa ssh-copy-id root@node01 ssh-copy-id root@node02 ### 优化内核参数 modprobe br_netfilter cat > /etc/sysctl.d/kubernetes.conf << EOF net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 net.ipv4.tcp_tw_recycle = 0 vm.swappiness = 0 vm.overcommit_memory = 1 vm.panic_on_oom = 0 fs.inotify.max_user_instances = 8192 fs.inotify.max_user_watches = 1048576 fs.file-max = 52706963 fs.nr_open = 52706963 net.ipv6.conf.all.disable_ipv6 = 1 net.netfilter.nf_conntrack_max = 2310720 EOF sysctl -p /etc/sysctl.d/kubernetes.conf scp /etc/sysctl.d/kubernetes.conf node01:/etc/sysctl.d/ scp /etc/sysctl.d/kubernetes.conf node02:/etc/sysctl.d/ sysctl -p /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf
**到此基本环境准备完毕**,需要在各节点上准备`kubernetes`的`yum`源,这里推荐使用阿里云的`yum`源先来`master`节点上操作
#Kubernetes的阿里源添加 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 或 #Kubernetes的清华源添加 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=kubernetes baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-$basearch enabled=1 gpgcheck=0 EOF
部署k8s组件
#这里注意,master节点部署了kubectl、kubelet、kubeadm三个组件,当然在部署前要指定和k8s版本一致的组件版本。 yum install kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 -y --nogpgcheck systemctl start kubelet systemctl enable kubelet #阿里源安装时,需要添加--nogpgcheck参数 #node节点只需部署kubelet-1.18.0 kubeadm-1.18.0即可 # 更改docker默认Cgroup驱动 在/etc/docker/daemon.json文件中,添加一句话即可,当然这个和我们的设置加速器写在一起了。 cat >> /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://1dmptu91.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF systemctl daemon-reload systemctl restart docker #不要忘了重新加载以及重启doker
kubeadm初始化
至此,准备工作做完,可以开始初始化,可是由于国内网络环境限制,我们不能直接从谷歌的镜像站下载镜像,有两种方法可以解决,第一种:需要我们手动从docker镜像站下载镜像,然后重新命名,也可以用脚本来实现。这里我们采用第二种:在初始化k8s的时候,指定镜像源为阿里云。
初始化时指定镜像仓库为阿里云
kubeadm init --kubernetes-version=v1.18.0 --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 192.168.8.10 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
或者还有其他方案将k8s集群状态配置问一个yaml文件,然后从yaml文件初始化
kubeadm config print init-defaults > kubeadm-config.yaml vim kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.8.10 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: master taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.18.0 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16 scheduler: {} --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs" #初始化集群 kubeadm init --config=kubeadm-config.yaml #成功后提示: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config kubeadm join 192.168.8.10:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:a2ec410cea22ef589a7af6072008fbace244a9106bde030e771e9d933124ceec # PS: 结果做一个保存 systemctl restart kubelet kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 5m3s v1.18.0
**可以看出master的状态是未就绪(NotReady**),之所以是这种状态是因为还缺少一个附件**flannel**,没有网络各Pod是无法通信的
//添加网络组件(flannel),组件flannel可以通过https://github.com/coreos/flannel中获取
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
//再次查看集群节点状态
kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 13m v1.15.0
以上是主节点的安装部署,然后个node节点的安装,和加入集群,这里注意,验证,node节点已经准备好了相关的镜像。
kubeadm join 192.168.8.10:6443 --token njus35.kw3hxkys3urmnuob --discovery-token-ca-cert-hash sha256:05761b73b571c18eebd6972fb70323cd3c4d8e0aa7514efa2680411310424184
node节点需要几个镜像,可以手动先下载一下,或者从master节点同步
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0 docker pull quay.io/coreos/flannel:v0.15.1 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
等待一会去master节点验证。等待的是同步flannel网络。
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 18m v1.15.0 node01 Ready <none> 68s v1.15.0 node02 Ready <none> 12s v1.15.0 > PS: 确保所有pod都是running状态。 //设置kubectl命令行工具自动补全功能 yum install -y bash-completion source /usr/share/bash-completion/bash_completion source <(kubectl completion bash) echo "source <(kubectl completion bash)" >> ~/.bashrc #为了以后我们写yaml文件方便些,这里设置tab键空格个数 vim .vimrc set tabstop=2 ######### source .vimrc #在master验证k8s组件 如下所示代表安装组件完整且是running状态 kubectl get pod -n kube-system -o wide NAME READY STATUS RESTARTS AGE coredns-7ff77c879f-qwb6g 1/1 Running 0 60m coredns-7ff77c879f-zhsgv 1/1 Running 0 60m etcd-master 1/1 Running 0 60m kube-apiserver-master 1/1 Running 0 60m kube-controller-manager-master 1/1 Running 0 60m kube-flannel-ds-s6cfd 1/1 Running 0 9m16s kube-flannel-ds-v75p7 1/1 Running 0 32m kube-flannel-ds-xhn7c 1/1 Running 0 11m kube-proxy-6ptb9 1/1 Running 0 60m kube-proxy-82lc6 1/1 Running 0 9m16s kube-proxy-h5g68 1/1 Running 0 11m kube-scheduler-master 1/1 Running 0 60m #记得三台节点最后要执行systemctl enable kubelet 忘记的集群就启动不了
==============================
Kubernetes部署“容器化应用”
在Kubernetes集群中部署一个Nginx :
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get pod,svc
访问地址:http://NodeIP:Port
在Kubernetes集群中部署一个Tomcat :
kubectl create deployment tomcat --image=tomcat kubectl expose deployment tomcat --port=8080 --type=NodePort
访问地址:http://NodeIP:Port
K8s部署微服务(springboot程序):
1、项目打包(jar、war)-->可以采用一些工具git、maven、jenkins
2、制作Dockerfile文件,生成镜像;
3、kubectl create deployment nginx --image= 你的镜像
4、你的springboot就部署好了,是以docker容器的方式运行在pod里面的;