k8s的安装及应用
-
安装docker
Kubernetes整体架构

Master
k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成;
Nodes
集群工作节点,运行用户业务应用容器;
Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime);
安装k8s
- 部署方式
选择使用kubeadm
Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;
- Kubernetes部署环境准备
关闭防火墙
systemctl stop firewalld systemctl disable firewalld关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭 setenforce 0 #临时关闭关闭swap(k8s禁止虚拟内存以提高性能)
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久 swapoff -a #临时在master和node添加hosts
cat >> /etc/hosts << EOF 192.168.172.134 k8smaster 192.168.172.135 k8snode EOF设置网桥参数(都需设置)
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF配置生效
sysctl --system #生效- 部署k8s
启动docker
systemctl start docker添加k8s的阿里云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安装 kubeadm,kubelet 和 kubectl
yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y systemctl enable kubelet.service启动k8s
- 部署Kubernetes Master主节点(在master上执行)
kubeadm init --apiserver-advertise-address=192.168.9.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16- 接下来在master机器上执行
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config- 接下来把node节点加入Kubernetes master中,在Node机器上执行;
向集群添加新节点,执行的命令就是kubeadm init最后输出的kubeadm join命令(在要添加的节点机器中执行)
kubeadm join 192.168.9.134:6443 --token wp7kpe.m4oltmw9aycudehz \ --discovery-token-ca-cert-hash sha256:be41c36ee26afaa877c77a2ddd1f629830542714b33a3458f5a338a9070e193a
- 部署网络插件
应用kube-flannel.yml文件得到运行时容器
kubectl apply -f kube-flannel.yml #在master机器上执行- 安装成功

尝试部署个nginx
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort查看pods

查看services

图中标记的端口才是对应浏览器访问的端口

k8s命令
整体流程:Mater控制Node --> namespace --> service --> deployment(控制器) --> pod--> docker
#查看一下,相关命令: kubectl get node(s) kubectl get namespace #以下命令可以通过-n <namespace>指定查询对应的namespace,不写默认查询default这个命名空间 kubectl get service(s) kubectl get deployment (deploy) kubectl get pod(s) #删除service kubectl delete service nginx #删除nginx的控制器 kubectl delete deployment nginx #删除pod kubectl delete pod nginx-6799fc88d8-zc48m(pod名字) #kubectl命令帮助 kubectl --helpk8s使用示例
- 部署Kubernetes Dashbaord(k8s的web ui)
Kubernetes仪表盘是Kubernetes集群的基于Web的通用UI,它允许用户管理群集中运行的应用程序并对其进行故障排除,以及管理群集本身
- 下载yaml的资源清单
#需FQ才可下载 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml- 修改下载的yaml文件

- 通过配置文件启动
kubectl apply -f recommended.yaml- 通过刚刚修改的配置文件端口浏览器访问

- 生成对应管理员的token
#未创建这个用户才需执行 这个命令(第一次才需执行) kubectl create serviceaccount dashboard-admin -n kube-system #未绑定权限用户才需执行 这个命令(第一次才需执行) kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin #查看token通过此命令 然后复制对应token进行登录 kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')- 登录后的页面

- 部署一个springboot项目
- 制作Dockerfile文件,生成镜像
此步骤需要在node节点操作,因为master节点是不参与容器的部署的,所以生成的镜像需要在node节点中
创建jdk.dockerfile文件
FROM centos:latest MAINTAINER yzy ADD jdk-8u251-linux-x64.tar.gz /usr/local/java ENV JAVA_HOME /usr/local/java/jdk1.8.0_251 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin CMD java -version构建镜像:
docker build -t -f jkd.dockerfile jdk1.8.0_251 .创建springboot-k8s-1.0.0-jar.dockerfile文件
FROM jdk1.8.0_251 MAINTAINER cat ADD springboot-k8s-1.0.0-jar /opt RUN chmod +x /opt/38-springboot-k8s-1.0.0.jar CMD java -jar /opt/38-springboot-k8s-1.0.0.jar构建镜像:
docker build -t springboot-k8s-1.0.0-jar -f springboot-k8s-1.0.0-jar.dockerfile .- 使用k8s命令生成对应的配置文件,以后通过这个配置文件进行部署容器(master节点执行)
kubectl create deployment springboot-k8s --image=springboot-k8s-1.0.0-jar --dry-run -o yaml > deploy.yaml- 修改生成的配置文件
因为是从本地拉取镜像,所以需要修改一下配置

- 通过命令部署容器
kubectl apply -f deploy.yaml
使用Ingress暴露应用
-
NodePort
NodePort服务是让外部请求直接访问服务的最原始方式,NodePort是在所有的节点(虚拟机)上开放指定的端口,所有发送到这个端口的请求都会直接转发到服务中的pod里;
三种端口说明
ports: - name: http port: 80 targetPort: 80 nodePort: 30008 protocol: TCPnodePort
外部机器(在windows浏览器)可以访问的端口;
比如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=30001,那么其他机器就可以通过浏览器访问scheme://node:30001访问到该服务;
targetPort
容器的端口,与制作容器时暴露的端口一致(Dockerfile中EXPOSE),例如docker.io官方的nginx暴露的是80端口;
port
Kubernetes集群中的各个服务之间访问的端口,虽然mysql容器暴露了3306端口,但外部机器不能访问到mysql服务,因为他没有配置NodePort类型,该3306端口是集群内其他容器需要通过3306端口访问该服务;
这种方式的不足:
1、一个端口只能供一个服务使用;
2、只能使用30000–32767之间的端口;
3、如果节点/虚拟机的IP地址发生变化,需要人工进行处理;
-
ingress
Ingress 英文翻译为:入口、进入、进入权、进食,也就是入口,即外部请求进入k8s集群必经之口

虽然k8s集群内部署的pod、service都有自己的IP,但是却无法提供外网访问,以前我们可以通过监听NodePort的方式暴露服务,但是这种方式并不灵活,生产环境也不建议使用;
Ingresss是k8s集群中的一个API资源对象,相当于一个集群网关,我们可以自定义路由规则来转发、管理、暴露服务(一组pod),比较灵活,生产环境建议使用这种方式;
使用Ingress Nginx的步骤:
1、部署Ingress Nginx
下载对应的ingress-deploy.yml
该配置文件相比官网,修改了镜像的地址,改为阿里云
使用命令部署kubectl apply -f ingress-deploy.yml
2、配置Ingress Nginx规则;
编写ingress-nginx-rule.yml文件
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: k8s-ingress
spec:
rules:
- host: shouyaya.com
http:
paths:
- pathType: Prefix
path: /
backend:
#这里选择k8s里已部署的容器
service:
name: nginx
port:
number: 80
使用命令配置规则kubectl apply -f ingress-nginx-rule.yml
若出现以下错误:

解决:kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
然后再次执行:kubectl apply -f ingress-nginx-rule.yaml
最后检查一下规则是否生效:kubectl get ingress

最后在本地配置下hosts文件,测试访问下


浙公网安备 33010602011771号