开源容器应用自动化部署技术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://kubernetes.io/
中文社区: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里面的;