kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。

这个工具能通过两条指令完成一个kubernetes集群的部署:

# 创建一个 Master 节点
$ kubeadm init# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master节点的IP和端口 >

1. 安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

2. 学习目标

  1. 在所有节点上安装Docker和kubeadm
  2. 部署Kubernetes Master
  3. 部署容器网络插件
  4. 部署 Kubernetes Node,将节点加入Kubernetes集群中
  5. 部署Dashboard Web页面,可视化查看Kubernetes资源

3. 准备环境

角色 IP
k8s-master 192.168.81.57
k8s-node1 192.168.81.58
k8s-node2 192.168…81.59
关闭防火墙:
$ systemctl stop firewalld
$ systemctl disable firewalld关闭selinux:
$ sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
$ setenforce 0  # 临时关闭swap:
$ swapoff -a  # 临时
$ vim /etc/fstab  # 永久设置主机名:
$ hostnamectl set-hostname <hostname>在master添加hosts:
$ cat >> /etc/hosts << EOF
192.168.81.57 k8s-master
192.168.81.58 k8s-node1
192.168.81.59 k8s-node2
EOF将桥接的IPv4流量传递到iptables的链:
$ 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

4. 所有节点安装Docker/kubeadm/kubelet

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

4.1 安装Docker

$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-18.06.1.ce-3.el7
$ systemctl enable docker && systemctl start docker
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
# cat > /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

4.2 添加阿里云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

4.3 安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

$ yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
$ systemctl enable kubelet

5. 部署Kubernetes Master

在192.168.81.57(Master)执行。

$ kubeadm init \--apiserver-advertise-address=192.168.81.57 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.17.0 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。

使用kubectl工具:

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

6. 安装Pod网络插件(CNI)

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

确保能够访问到quay.io这个registery。

如果Pod镜像下载失败,可以改成这个镜像地址:lizhenliang/flannel:v0.11.0-amd64

7. 加入Kubernetes Node

在192.168.81.58/59(Node)执行。

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:

$ kubeadm join 192.168.81.57:6443 --token oirnjr.kum3lbm9h0iydsxl \--discovery-token-ca-cert-hash sha256:3fd712df713d585ebd0adfe025e8cdcbb49f1d6c4bfafaa08ee9ac12d6eec04a

8. 测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc

访问地址:http://NodeIP:Port

# 给 nginx 添加副本集为3个
kubectl scale deployment nginx --replicas=3

9. 部署 Dashboard

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

默认镜像国内无法方位,修改镜像地址为:lizhenliang/kubernetes-dashboard-amd64:v1.10.1

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:type: NodePort  # 添加ports:- port: 443targetPort: 8443nodePort: 30001  # 添加selector:k8s-app: kubernetes-dashboard

访问地址:http://NodeIP:30001

创建service account并绑定默认cluster-admin管理员集群角色:

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}')

使用输出的token登录Dashboard。

1、项目迁移到K8s平台流程:

1、制作镜像 ---> 2、控制器管理pod ----> 3、暴露应用 ----> 4、对外发布应用 ---> 5、日志监控1、制作镜像
镜像分层:首先基础镜像(hub、docker)、运行环境镜像(centos、JDK\PHP\GO)、项目镜像(Docker、K8S)2、控制器管理pod

基本概念

Kubernetes集群架构与组件

kubectl命令行管理工具


Pod

  • 最小部署单元
  • 一组容器的集合
  • 一个Pod中的容器共享网络命名空间(共享存储)
  • Pod是短暂的

Controllers

  • ReplicaSet:确保预期的Pod副本数量
  • Deployment : 无状态应用部署
  • StatefulSet :有状态应用部署
  • DaemonSet:确保所有Node运行同一个Pod
  • Job:一次性任务
  • Cronjob :定时任务
  • 更高级层次对象,部署和管理Pod

Service

  • 防止Pod失联
  • 定义一组Pod的访问策略
  • Label : 标签,附加到某个资源上,用于关联对象、查询和筛选
  • Namespaces : 命名空间,将对象逻辑上隔离

运行pod通常一个应用多个副本分散在每个节点,用户找谁需要添加负载均衡LB ,怎么找到?内部服务发现,发现pod,用户就可通过LB服务发现找到pod SVC(找到所需的pod,定义负载均衡策略)

部署java项目

[root@k8s-master ~]# ls
1.txt            helm-v3.0.0-linux-amd64.tar.gz  kube-flannel.yaml          tomcat-java-demo-master
anaconda-ks.cfg  ingress-controller.yaml         kubernetes-dashboard.yaml  tomcat-java-demo-master.zip
# 解压java-demo项目
[root@k8s-master ~]# unzip tomcat-java-demo-master.zip
[root@k8s-master ~]# cd tomcat-java-demo-master
[root@k8s-master tomcat-java-demo-master]# ls
db  Dockerfile  LICENSE  pom.xml  README.md  src# src 源代码
# pom.xml java项目支持的编译环境编辑的依赖包
# Dockerfile  打包的项目镜像
# db  项目的sql文件# 添加一台myslq机器
192.168.81.60
[root@localhost ~]# hostname mysql
[root@localhost ~]# bash
[root@mysql ~]# yum -y install mariadb  mariadb-server
[root@mysql ~]# systemctl start mariadb && systemctl enable mariadb# master将java-demo项目的db文件的tables_ly_tomcat.sql导入到数据库机器
[root@k8s-master db]# ls
tables_ly_tomcat.sql
# scp传入sql
[root@k8s-master db]# scp tables_ly_tomcat.sql root@192.168.81.60:
# 源代码数据库配置
[root@k8s-master resources]# pwd
/root/tomcat-java-demo-master/src/main/resources
[root@k8s-master resources]# ls
application.yml  log4j.properties  static  templates
[root@k8s-master resources]# vim application.yml
server:port: 8080
spring:datasource:url: jdbc:mysql://192.168.81.60:3306/test?characterEncoding=utf-8username: testpassword: 123.comdriver-class-name: com.mysql.jdbc.Driverfreemarker:allow-request-override: falsecache: truecheck-template-location: truecharset: UTF-8content-type: text/html; charset=utf-8expose-request-attributes: falseexpose-session-attributes: falseexpose-spring-macro-helpers: falsesuffix: .ftltemplate-loader-path:- classpath:/templates/
# 修改数据连接地址192.168.81.60,查看数据库为test ,username: test password: 123.com# 192.168.81.70数据库操作
[root@mysql ~]# mysql -uroot
# 切换test数据库下
MariaDB [(none)]> use test
Database changed
# 查看表
MariaDB [test]> show tables;
Empty set (0.00 sec)
# 导入sql
MariaDB [test]> source /root/tables_ly_tomcat.sql;
Query OK, 1 row affected, 1 warning (0.00 sec)Database changed
Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)# 再次查看表
MariaDB [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+# 授权test库 test用户密码123.com
MariaDB [test]> grant all on test.* to 'test'@'%' identified by '123.com';# node节点测试连接数据库
[root@k8s-node2 ~]# yum -y install mariadb
[root@k8s-node2 ~]# mysql -h192.168.81.60 -utest -p123.com
Welcome to the MariaDB monitor.  Commands end with ; or \g.# 测试通过制作镜像
# 安装 java 编译环境
[root@k8s-master resources]# yum -y install maven java-1.8.0-openjdk# mvn 编译
[root@k8s-master ~]# cd tomcat-java-demo-master
[root@k8s-master tomcat-java-demo-master]# mvn clean package -Dmaven.test.skip=true # 构建完毕生成一个 target 目录,修改完原代码需要重新构建生成war包
[root@k8s-master tomcat-java-demo-master]# ls
db  Dockerfile  LICENSE  pom.xml  README.md  src  target
[root@k8s-master tomcat-java-demo-master]# ls target/
classes  generated-sources  ly-simple-tomcat-0.0.1-SNAPSHOT  ly-simple-tomcat-0.0.1-SNAPSHOT.war  maven-archiver  maven-status
# 构建镜像
[root@k8s-master tomcat-java-demo-master]# docker build -t yexu/java-demo .
-t, --tag list # 镜像名称
-f, --file string # 指定Dockerfile文件位置# 登陆docekrhub 推送镜像方便拉取
[root@k8s-master tomcat-java-demo-master]# docker login
[root@k8s-master tomcat-java-demo-master]# docker push yexu/java-demo# kubectl不直接部署间接查看yaml,
--dry-run  #测试不运行
-o  # 指定为yaml格式
[root@k8s-master ~]# kubectl create deployment java-demo --image=yexu/java-demo --dry-run -o yaml
# 直接运行
[root@k8s-master ~]# kubectl create deployment java-demo --image=yexu/java-demo --dry-run -o yaml >deploy.yaml# 查看修改yaml
[root@k8s-master ~]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: java-demoname: java-demo
spec:replicas: 3selector:matchLabels:app: java-demotemplate:metadata:creationTimestamp: nulllabels:app: java-demospec:containers:- image: yexu/java-demoname: java-demo# 执行yaml查看
[root@k8s-master ~]# kubectl apply -f deploy.yaml
deployment.apps/java-demo created
[root@k8s-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
java-demo-6f6668759c-2pkhp   1/1     Running   0          112s
java-demo-6f6668759c-45ccw   1/1     Running   0          112s
java-demo-6f6668759c-wqhh4   1/1     Running   0          112s
nginx-86c57db685-s7dbb       1/1     Running   0          22h# 暴露端口
kubectl expose  #创建service 类型deployment 名称java-demo service端口用于集群内部间访问:--port=80    容器内跑服务的端口:--target-port=8080     类型nodeport用于集群外部访问 -o 导出yaml --dry-run 尝试运行
[root@k8s-master ~]# kubectl expose deployment java-demo --port=80 --target-port=8080 --type=NodePort -o yaml --dry-run >svc.yaml# 查看修改yaml
[root@k8s-master ~]# cat svc.yaml
apiVersion: v1
kind: Service
metadata:labels:app: java-demoname: java-demo
spec:ports:- port: 80protocol: TCPtargetPort: 8080selector:app: java-demotype: NodePort# 执行
[root@k8s-master ~]# kubectl apply -f svc.yaml
service/java-demo created# 查看pod,svc
[root@k8s-master ~]# kubectl get pod,svc
NAME                             READY   STATUS    RESTARTS   AGE
pod/java-demo-6f6668759c-2pkhp   1/1     Running   0          26m
pod/java-demo-6f6668759c-45ccw   1/1     Running   0          26m
pod/java-demo-6f6668759c-wqhh4   1/1     Running   0          26m
pod/nginx-86c57db685-s7dbb       1/1     Running   0          22hNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/java-demo    NodePort    10.96.101.80    <none>        80:32700/TCP   44s
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        24h
service/nginx        NodePort    10.96.248.209   <none>        80:30165/TCP   23h

理解Pod对象

  • 最小部署单元
  • 一组容器的集合
  • 一个Pod中的容器共享网络命名空间与存储
  • Pod是短暂的

Pod存在的意义

Pod为亲密性应用而存在。

气密性应用场景:

  • 两个应用之间发生文件交互
  • 两个应用需要通过127.0.0.1或者socket通信
  • 两个应用需要发生频发的调用

Pod实现机制

  • 共享网络
  • 共享存储

Pod想要做到网络共享需要多个容器都在一个namespaces

# 示例
kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
java-demo-6f6668759c-4bbj7   1/1     Running   0          45h
java-demo-6f6668759c-tct6j   1/1     Running   0          45h
java-demo-6f6668759c-zkqdq   1/1     Running   0          45h
nginx-86c57db685-s7dbb       1/1     Running   0          2d20h# 导出yaml
kubectl get pod java-demo-6f6668759c-4bbj7 -o yaml >pod.yaml# 修改yaml
[root@k8s-master ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:labels:app: my-pod name: my-pod namespace: default
spec:containers:- image: nginxname: nginximage: nginx- image: java-demoname: javaimage: yexu/java-demo:latest# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
java-demo-6f6668759c-4bbj7   1/1     Running   0          45h
java-demo-6f6668759c-tct6j   1/1     Running   0          45h
java-demo-6f6668759c-zkqdq   1/1     Running   0          45h
my-pod                       2/2     Running   0          19m
nginx-86c57db685-s7dbb       1/1     Running   0          2d20h
# 发现my-pod有两个容器2/2# 查看描述IP相同连个容器为同一个IP
[root@k8s-master ~]# kubectl describe pod my-pod
Name:         my-pod
Namespace:    default
Priority:     0
Node:         k8s-node2/192.168.81.59
Start Time:   Fri, 22 Jan 2021 14:36:26 +0800
Labels:       app=my-pod
Annotations:  kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"app":"my-pod"},"name":"my-pod","namespace":"default"},"spec":{"con...
Status:       Running
IP:           10.244.2.13
IPs:IP:  10.244.2.13
Containers:nginx:Container ID:   docker://d22872db08adcb9dfbfaa69ae87e106d2f4062543c02ca30fa2e6378e5c5197cImage:          nginxImage ID:       docker-pullable://nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aaPort:           <none>Host Port:      <none>State:          RunningStarted:      Fri, 22 Jan 2021 14:36:34 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-fd8lf (ro)java:Container ID:   docker://f7b7d906971854013c0a8ff815075ee909c5f12177e4126bc63dfed5ce0727a2Image:          yexu/java-demo:latestImage ID:       docker-pullable://yexu/java-demo@sha256:8fb25c40ca69834e69b801f373e388feb386bd67c5dc89aa4cb4d21d0ba39e5dPort:           <none>Host Port:      <none>State:          RunningStarted:      Fri, 22 Jan 2021 14:36:38 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-fd8lf (ro)
Conditions:Type              StatusInitialized       True Ready             True ContainersReady   True PodScheduled      True
Volumes:default-token-fd8lf:Type:        Secret (a volume populated by a Secret)SecretName:  default-token-fd8lfOptional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300snode.kubernetes.io/unreachable:NoExecute for 300s
Events:Type    Reason     Age   From                Message----    ------     ----  ----                -------Normal  Scheduled  21m   default-scheduler   Successfully assigned default/my-pod to k8s-node2Normal  Pulling    21m   kubelet, k8s-node2  Pulling image "nginx"Normal  Pulled     21m   kubelet, k8s-node2  Successfully pulled image "nginx"Normal  Created    21m   kubelet, k8s-node2  Created container nginxNormal  Started    21m   kubelet, k8s-node2  Started container nginxNormal  Pulling    21m   kubelet, k8s-node2  Pulling image "yexu/java-demo:latest"Normal  Pulled     21m   kubelet, k8s-node2  Successfully pulled image "yexu/java-demo:latest"Normal  Created    21m   kubelet, k8s-node2  Created container javaNormal  Started    21m   kubelet, k8s-node2  Started container java
Pod Template常用功能字段解析
变量
拉取镜像
资源限制
健康检查# Serivec 用户访问Service内部发现Pod,转发流量发现Pod,
# 健康检查有两种:
1、检查Pod启的应用程序是否正常,不正常会根据Pod里设置的策略发现重建Pod
2、检查Pod应用程序不正常,告诉serive不转发流量剔除

Pod容器分类与设计模式

Infrastructure Container:基础容器 维护整个Pod网络空间

InitContainers:初始化容器 先于业务容器开始执行

Containers:业务容器 并行启动

Deployment控制器

1、Pod与Controllers的关系

  • controllers:在集群管理和运行容器的对象
  • 通过label-selector相关联
  • Pod通过控制器实现应用的运维,如伸缩,滚动升级等

2、Deployment功能与应用场景

  • 部署无状态应用
  • 管理Pod和ReplicaSet
  • 具有上线部署、副本设定、滚动升级、回滚等功能
  • 提供声明式更新,例如只更新一个新的Image

应用场景:Web服务,微服务

3、YAML字段解析

deployment中yaml分为2部分:控制器定义和被控制对象

4、使用Deployment部署无状态应用

# 创建示例
[root@k8s-master ~]# kubectl create deployment web --image=nginx --dry-run -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: webname: web
spec:replicas: 1selector:matchLabels:app: webstrategy: {}template:metadata:creationTimestamp: nulllabels:app: webspec:containers:- image: nginxname: nginxresources: {}
status: {}# 套用yaml
[root@k8s-master ~]# kubectl create deployment web --image=nginx --dry-run -o yaml>web.yaml# 清除无用的yaml配置,修改镜像为yexu/java-demo
[root@k8s-master ~]# vim web.yaml
[root@k8s-master ~]# cat web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: webname: web
spec:replicas: 3selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- image: yexu/java-demo name: java# 引用yaml启动
[root@k8s-master ~]# kubectl apply -f web.yaml
deployment.apps/web created# 查看Pod
[root@k8s-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
dry-run-85865666c4-bg6lj     1/1     Running   0          22m
java-demo-6f6668759c-4bbj7   1/1     Running   0          4d18h
java-demo-6f6668759c-tct6j   1/1     Running   0          4d18h
java-demo-6f6668759c-zkqdq   1/1     Running   0          4d18h
my-pod                       2/2     Running   0          2d21h
nginx-86c57db685-s7dbb       1/1     Running   0          5d17h
web-685bf56875-fr7td         1/1     Running   0          27s
web-685bf56875-kn9kl         1/1     Running   0          26s
web-685bf56875-tl6lc         1/1     Running   0          26s# 查看已经部署的
[root@k8s-master ~]# kubectl get deploy
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
dry-run     1/1     1            1           140m
java-demo   3/3     3            3           4d20h
nginx       1/1     1            1           5d20h
web         3/3     3            3           118m# 开启端口
[root@k8s-master ~]# kubectl expose --name=web deployment web --port=80 --target-port=8080 --type=NodePort# 查看service,web端口为32713
[root@k8s-master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
java-demo    NodePort    10.96.148.245   <none>        80:30793/TCP   4d20h
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        5d21h
nginx        NodePort    10.96.248.209   <none>        80:30165/TCP   5d20h
web          NodePort    10.96.205.107   <none>        80:32713/TCP   31s# 浏览器访问
http://192.168.81.57:32713/

5、升级与滚动

# 升级(创建一个新的容器,然后新容器为running状态,将旧容器打标记然后删除,一次类推升级第二个容器创建pod启动pod将旧的pod打标记然后删除)
kubectl set image deployment/web nginx=nginx:1.15
# 查看升级状态
kubectl rollout status deployment/web # 回滚
kubectl rollout history deployment/web
kubectl rollout undo deployment/web
kubectl rollout undo deployment/web --revision=2
# 升级示例
# 升级java为nginx
[root@k8s-master ~]# kubectl set image deployment web java=nginx
deployment.apps/web image updated# 查看pod
[root@k8s-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
dry-run-85865666c4-bg6lj     1/1     Running   0          169m
java-demo-6f6668759c-4bbj7   1/1     Running   0          4d20h
java-demo-6f6668759c-tct6j   1/1     Running   0          4d20h
java-demo-6f6668759c-zkqdq   1/1     Running   0          4d20h
my-pod                       2/2     Running   0          2d23h
nginx-86c57db685-s7dbb       1/1     Running   0          5d20h
web-557c6dc8d7-mhlds         1/1     Running   0          35s
web-557c6dc8d7-mx5bp         1/1     Running   0          21s
web-557c6dc8d7-w4dmx         1/1     Running   0          28s# 继续访问浏览器无法访问,因为nginx端口转发不对是tomcat的
http://192.168.81.57:32713/# 编辑web的svc
[root@k8s-master ~]# kubectl edit svc/web
service/web edited
# targetPort: 8080修改8080为80# http://192.168.81.57:32713/        //访问成功为nginx版本
# 回滚示例
# 查看deployment滚动更新记录
root@k8s-master ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION  CHANGE-CAUSE
1         <none>
2         <none># 回滚版本,默认给回滚上个版本
[root@k8s-master ~]# kubectl rollout undo deployment web
deployment.apps/web rolled back
[root@k8s-master ~]# kubectl get pod
NAME                         READY   STATUS        RESTARTS   AGE
dry-run-85865666c4-bg6lj     1/1     Running       0          3h6m
java-demo-6f6668759c-4bbj7   1/1     Running       0          4d20h
java-demo-6f6668759c-tct6j   1/1     Running       0          4d20h
java-demo-6f6668759c-zkqdq   1/1     Running       0          4d20h
my-pod                       2/2     Running       0          3d
nginx-86c57db685-s7dbb       1/1     Running       0          5d20h
web-557c6dc8d7-mhlds         0/1     Terminating   0          16m
web-685bf56875-gj6wm         1/1     Running       0          20s
web-685bf56875-jk6rn         1/1     Running       0          25s
web-685bf56875-mmwd6         1/1     Running       0          14s# 编辑svc
[root@k8s-master ~]# kubectl edit svc/web
service/web edited
# targetPort: 8080      修改80为8080# http://192.168.81.57:32713/      //访问成功为上个java版本

6、弹性伸缩

# 扩容示例,修改副本集
[root@k8s-master ~]# kubectl scale deployment web --replicas=5
deployment.apps/web scaled# 副本集3个变为5个
[root@k8s-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
dry-run-85865666c4-bg6lj     1/1     Running   0          3h25m
java-demo-6f6668759c-4bbj7   1/1     Running   0          4d21h
java-demo-6f6668759c-tct6j   1/1     Running   0          4d21h
java-demo-6f6668759c-zkqdq   1/1     Running   0          4d21h
my-pod                       2/2     Running   0          3d
nginx-86c57db685-s7dbb       1/1     Running   0          5d20h
web-685bf56875-gj6wm         1/1     Running   0          19m
web-685bf56875-jk6rn         1/1     Running   0          19m
web-685bf56875-mmwd6         1/1     Running   0          19m
web-685bf56875-ntkvj         1/1     Running   0          32s
web-685bf56875-q9pdp         1/1     Running   0          32s

每创建一个deployment都会生成一个replicaset

[root@k8s-master ~]# kubectl get deploy,rs
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/dry-run     1/1     1            1           3h27m
deployment.apps/java-demo   3/3     3            3           4d21h
deployment.apps/nginx       1/1     1            1           5d21h
deployment.apps/web         3/3     3            3           3h5mNAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/dry-run-85865666c4     1         1         1       3h27m
replicaset.apps/java-demo-6f6668759c   3         3         3       4d21h
replicaset.apps/nginx-86c57db685       1         1         1       5d21h
replicaset.apps/web-557c6dc8d7         0         0         0       38m
replicaset.apps/web-685bf56875         3         3         3       3h5m# 创建deployment会先创建rs,rs关联Pod,rs判断deployment的replicas副本数,获取当前运行的副本数,多了rs删除一个,少了rs添加一个
# 还有一个功能历史版本的记录
# 版本回滚也是RS负责的,创建新的RS,新的镜像启动Pod,关联到service,用户访问service,新的pod准备就绪,杀掉旧的rs的pod,再次新的就绪再次杀掉旧的直到完全迁到新的pod。

Service统一入口应用

Service存在的意义

  • 防止Pod失联(服务发现)
  • 定义一组Pod的访问策略(负载均衡)
  • 支持ClusterIP,NodePort以及LoadBalancer三种类型

Pod与Service的关系

  • 通过label-selector相关联
  • 通过Service实现Pod的负载均衡(TCP/UDP 4层)

Service几种类型

**ClusterIP:**分配一个内部集群的IP地质,只能在集群内部访问(同Namespace内的Pod),默认ServiceType;

ClusterIP模式的Service为你提供的就是一个Pod的稳定的IP地址,即VIP。

**NodePort:**分配一个内部集群IP地址,并在每个节点上启动一个端口来暴露服务,可以在集群外部访问;

**LoadBalancer:**分配一个内部集群IP地址,并在每个节点上启动一个端口来暴露服务。除此之外,Kubernetes会在请求底层云平台上的负载均衡器,将每个Node([NodoIP]:[NodePord])作为后端添加进去。

使用kubeadm快速部署一个K8s集群相关推荐

  1. K8S 集群部署(快速部署一个 K8S 集群)

    https://youdianzhishi.com/web/course/1004/1019 https://www.qikqiak.com/post/manual-install-high-avai ...

  2. 吊炸天!一行命令快速部署大规模K8S集群!!!

    吊炸天!一行命令快速部署大规模K8S集群!!! 先决条件 请事先准备好几台服务器(测试环境虚拟机即可) 请事先设置好相同的root密码(方便同时操作多服务器) 请事先在Linux安装好docker 请 ...

  3. 如何快速部署一个Elasticsearch集群?

    作者:无敌码农 来源:无敌码农 今天的文章给大家介绍下Elasticsearch这一目前在"搜索"和"分析"领域使用十分广泛的技术组件.并演示如何快速构建一个E ...

  4. 使用kubeadm部署一个K8s集群

    1.前言 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: 2. 安装要求 一台或多台机器,操作系统 Ce ...

  5. 如何部署一个Kubernetes集群

    来源 | 无敌码农 责编 | 寇雪芹 头图 | 下载于视觉中国 在上一篇文章<Kubernetes和Docker的关系是什么?>中,和大家分享了关于Kubernetes的基本系统架构以及关 ...

  6. 基于kubeadm快速部署kubernetes K8S V1.17.4集群-无坑完整版

    基于kubeadm快速部署kubernetes K8S V1.17.4集群,并部署Dashboard Web页面,实现可视化查看Kubernetes资源 主机配置规划 服务器名称(hostname) ...

  7. Kubernetes学习-K8S安装篇-Kubeadm安装高可用K8S集群

    Kubernetes学习-K8S安装篇-Kubeadm高可用安装K8S集群 1. Kubernetes 高可用安装 1.1 kubeadm高可用安装k8s集群1.23.1 1.1.1 基本环境配置 1 ...

  8. Centos7 安装部署Kubernetes(k8s)集群过程

    1.系统环境 服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.9 Docker version 20.10.12 x86_64 2.前言 如下图描述了软件部 ...

  9. 从0开始构建一个k8s集群

    环境准备 安装k8s集群需要的配置较高,官方建议是最低 2核2G. 本篇安装k8s是在本地搭建的3台centos虚拟机,使用Vagrant构建centos.有关Vagrant的安装使用可以参考Vagr ...

最新文章

  1. 「linux网络管理」OSI模型
  2. exit()与_exit()的区别(转)
  3. 非线性求解器Casadi使用简介
  4. java中小写转大写函数_lotus 中日期小写转大写的函数及算法(lotus script) (转)...
  5. 各种协议中的协议类型对应的值
  6. 耳鼻喉专科服务机构“仁树医疗”完成数千万元A轮融资...
  7. 一个filter子查询测试
  8. linux硬件 软件raid,Linux下软件RAID的实现
  9. 四种依恋类型_【工具】成人依恋量类型介绍
  10. os模块,序列化模块,json模块,pickle模块
  11. 新增国内mysql下载镜像
  12. Memcache分组和同步机制的实现
  13. 第二章 部署war包到tomcat
  14. 第二百五十一节,Bootstrap项目实战--响应式轮播图
  15. linux crontab 定时任务解析
  16. visio 2010图形安装包
  17. DDOS---低轨道离子炮具体使用
  18. macOS安装wget
  19. 华为novia3i鸿蒙,华为nova3i一马当先:值得年轻人购买的智能手机推荐
  20. 皮尔逊Person相关系数

热门文章

  1. unity的战争迷雾插件
  2. oracle 恢复用户表空间,Oracle以TSPITR方式恢复表空间数据一例
  3. matlab 进行非线性回归,5.利用Matlab编程进行非线性回归分析.doc
  4. 网络平台做用户实名认证的好处
  5. 解决我的驱动无法卸载的问题
  6. Oracle公司及产品介绍
  7. html5游戏 遥控器按键,遥控器按键功能说明汇总
  8. python怎么判断真假_Python不超过10行代码就可实现人脸识别,教你辨别真假
  9. 设置屏幕色调、饱和度、亮度来保护眼睛
  10. #芯片# N25Q128A21BSF40F