1.k8s kubernetes来自希腊语舵手,google, 8是ubernete
1.管理docker容器 go写的(并发)
2.用于微服务
3.cncf云原生基金会
2.mater(管理节点)和nodes(微服务节点)
3.部署
1.minikube kind官网在线测试语句
2.kubeadm(官方)(安装比较方便 添加)
3.github下载二进制包
4.yum(老)
5.大神封装的环境
6.买云服务商提供的 阿里云
4.kubeadm
- cent7 2g2core
- interact network between two nodes(download flannel.yum file connect network)
- forbid swap areas ,firework
- xshell 查看—>撰写–>send cmd at the same time
- kubelet(manage POD and container,in every node of cluster )
kubeadm(init cluster)
kubectl(client can connect it )
5.蓝绿发布 预发布(nginx 摘一台机器发布,其他其它的可以正常运行,然后再摘除运行)
6.!!!牛 linux插件直接上传选择的文件
yum install lrzsz -y
rz #upload file
sz #download file
7.部署过程
1.关闭防火墙和selinux和swap(k8s为了提供性能关闭虚拟内存) mater和nodes同时配置
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
setenforce 0 #临时close swap
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
swapoff -a #临时
//改host文件方便访问
cat >> /etc/hosts << EOF
192.168.192.100 k8smaster
192.168.172.101 k8snode
EOF
//改k8s,让网络生效配置文件
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
//执行命令
sysctl --system #生效
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
2.安装docker19 mater和nodes同时配置
yum install wget -y
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install docker-ce-19.03.13 -y
//改docker加速配置
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://gg3gwnry.mirror.aliyuncs.com"]
}
//启动服务
systemctl enable docker.service
//k8s阿里源
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 kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y
//启动服务
systemctl enable kubelet.service
//查看服务和版本
yum list installed | grep kubelet
yum list installed | grep kubeadm
yum list installed | grep kubectl
kubelet --version
3.master节点执行init命令 会生成join命令
kubeadm init --apiserver-advertise-address=192.168.172.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
4.master复制配置文件
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
5.join命令如果被重复执行,必须删除节点重启node节点
//master生成命令,给node执行join,node不用init
//坑!!! 主节点的 /etc/kubernetes/admin.conf 一定要复制到node 不然not connection
//坑hostname作为k8s的简单名,不能重复 ,用nmtui修改
//坑 删除“$HOME/.kube/config”文件并执行kubeadm reset命令方可解除 ,(出现各种配置文件和端口占用)
//坑!!!
//查看master init生成的join命令
kubeadm token create --print-join-command
//删除节点
kubectl drain node1 --delete-local-data --force --ignore-daemonsets
kubectl delete nodes node1
//重新加入节点
//disabled_plugins = []
//必须重启节点
kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
systemctl start docker
systemctl start kubelet
6.从节点执行master生成的join命令
kubeadm join 192.168.172.132:6443 --token wa5bif.zfuvbesevdfvf4of \
--discovery-token-ca-cert-hash sha256:87cf5828d54dd80da13c4b57c57360370ea0267a7cc3991989ca3006cf3e44d8
7.节点状态都是notready(坑,节点重启也要重新提交网络)(可以打通master和node内部访问的端口),要在master配置网络(其实都可以,apply上去就好了)
(重启只要主节点还在,就会重新部署从节点的pod)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
//等待片刻...,发现pod flannel
kubectl get nodes
8.pod 一个可运行1/多个docker容器
9.k8s部署容器化应用nginx
打jar/war包
写Dockerfile生成镜像
kubectl create deployment nginx --image=镜像名,暴露端口
镜像运行在pod中
//下面重复启动如何删除节点
//部署nginx,通过docker间接创建容器看到running,可能在不同容器运行
//暴露端口
//查看控制节点,和子节点的状态, 暴露节点的服务
kubectl get deploy
kubectl get pod //或者pods
kubectl get services
//生成节点
kubectl delete deployment nginx //pod
//默认在default namespace创建
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
#部署tomcat
kubectl create deployment tomcat --image=tomcat
kubectl expose deployment tomcat --port=8080 --type=NodePort
//运行springboot项目!!!,记得先测试jar包成功,不然也是会报PullErr的
//写Dockerfile文件
FROM openjdk:8-jdk
VOLUME /tmp
ADD target/demo.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
//打包为镜像
docker build -t 38-springboot-k8s-1.0.0-jar .
//spingboot试运行,可以空运行生成yaml文件,然后提交yaml到k8s运行
kubectl create deployment springboot-k8s --image=38-springboot-k8s-1.0.0-jar --dry-run=client -o yaml > deploy.yaml
//改yaml在本地拉取,默认远程拉取,不行包PullErr错误
vi deploy.yaml文件里面container镜像从本地拉取;
imagePullPolicy: Never
//提交到k8s
kubectl apply -f deploy.yaml
//暴露端口
kubectl expose deployment springboot-k8s --port=8080 --type=NodePort
kubectl get pod,svc
//访问从内:外
10.k8s dashboard 使用页面管理
//提交文件到k8s拉镜像
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
kubectl apply -f recommended.yaml
//文件修改配置文件里,可以用内部修改配置文件!!!(get pod无法看到已经启动的端口)
kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
//生成token复制到访问页面dashboard
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
11.3种端口
- nodePort向外暴露的端口
// 优点 :type:NodePort可以暴露端口,yaml有写不用写语句 nodeport指定端口
//不足: 1.一个服务一个端口使用2.只能使用30000-32767端口 3.如果虚拟机ip变化,需要人工处理(ip被写进配置了)
- targetPort 容器的端
- port 集群服务之间内部的端口
12.ingress入口(生产使用,不是内置的) 相当于网关,代替nodePort直接暴露关机端口可能变化
//有多种方式安装,我们使用拉取 nginx的方式
//下载deploy.yuml文件,改image的地址
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml
spec:
329 hostNetwork: true //添加
330 dnsPolicy: ClusterFirst
331 containers:
332 - name: controller
333 image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.33.0 //修改
334 imagePullPolicy: IfNotPresent
//rule.yaml用于配置路由的规则,比如外面要访问到www.abc.com才能直接访问到内部80nginx端口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: k8s-ingress
spec:
rules:
- host: www.abc.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: nginx
port:
number: 80
kubectl apply -f rule.yaml
//如果之前存在
kubectl delete ing k8s-ingress
//查看配置的规则,记住要看规则的地址,客户端通过域名和ip同时访问服务器,然后通过ingress自动映射到pod的内部端口80
//要在规则配置容器的内部端口才能访问!!!
kubectl get ing
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
//windows模拟访问到C:\Windows\System32\drivers\etc\hosts添加192.168.192.100 www.abc.com
//提交的任务如果有错误可以 kubectl delete servive/deploy/pod xx
//在客户端访问www.abc.com会跳到nginx页面
13.部署springcloud项目
//k8s部署无状态访问(静态数据) pod删除掉数据也保存下来没有影响下一次部署, euraka是有状态访问,影响灰度发布, 数据库会动态增加数据
//!!!到工作节点上传jar和Dockerfile
//先部署提供者和消费者,再部署网关,在加ingress(rule)
//和springboot流程一致,增加了ingress
//查看容器日志
kubectl logs -f xxxpods
//deploy是controller的类型,还可以部署定时任务…
14.动态扩容缩容
//改yaml的replicate的数量,注册中心会知道注册了多少台服务器
//如果在运行,更新配置文件
vi deploy.yaml文件里面container镜像从本地拉取;
//修改集群数
spec:
replicas: 2
kubectl apply -f deploy.yaml