JAVA开发(虚拟化技术K8S)

k8s无疑是未来替代docker的虚拟化技术。

1、kubernetes是一个开源的容器集群管理系统,是一套自动化部署工具;而Docker是一个开源的应用容器引擎,是一种容器化技术。

2、docker是容器层面的,kubernetes是容器编排层面的。

K8S更像一个系统,docker只是一个技术组件。而K8S也可以架设在docker之上,或者其他的虚拟化容器之上。K8S是一套解决虚拟化集群部署的技术架构或者应用管理平台。

Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

k8s架构:master(cluster)/worker(node)的架构模式

JAVA开发(虚拟化技术K8S)_第1张图片

 

典型的 Kubernetes 集群包含一个 master 和很多 node。
Master 是控制集群的中心,node 是提供 CPU、内存和存储资源的节点。
Master 上运行着多个进程,包括面向用户的 API 服务、负责维护集群状态的 Controller Manager、负责调度任务的 Scheduler 等。
每个 node 上运行着维护 node 状态并和 master 通信的 kubelet,以及实现集群网络服务的 kube-proxy。

K8S的好处,或者说可以实现的特点:

JAVA开发(虚拟化技术K8S)_第2张图片

 

K8S安装部署样例:

准备环境:三台centos7 服务器

192.168.6.129 k8s-master(主)

192.168.6.130 k8s-node-1(节点)

192.168.6.131 k8s-node-2(节点)

kubernetes(k8s)的安装方法

五种方法:

  • kubernetes 二进制安装 (配置最繁琐,不亚于安装openstack)

  • kubeadm 安装 (谷歌推出的自动化安装工具,网络有要求)

  • minikube 安装 (仅仅用来体验k8s)

  • yum 安装 (最简单,版本比较低====学习推荐此种方法)

  • go编译安装 (最难)

我们采用yum安装,学习怎么使用k8s才是重点。

安装前准备工作:

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 查看hostname并修改

hostname   # 查看本机hostname
hostnamectl set-hostname k8s-master # 把本机名设置成k8s-master
hostnamectl status  # 查看修改结果
echo "127.0.0.1 $(hostname)" >> /etc/hosts  # 修改hosts文件

# 关闭selinux(linux的安全机制)
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

# 关闭swap(关闭内存交换)
swapoff -a
sed -ri 's/.*swap.*/#&/' '/etc/fstab'
free -m  # 检查,确保swap里面没有东西

# 配置桥接流量
cat <

1、修改主机和host 解析

#请在129-130-131三台机器都执行如下操作

vim /etc/hosts:

1

2

3

192.168.6.129 k8s-master

192.168.6.130 k8s-node-1

192.168.6.131 k8s-node-2

修改主机名:

1

2

3

hostnamectl set-hostname k8s-master

hostnamectl set-hostname k8s-node-1

hostnamectl set-hostname k8s-node-2

2: 安装docker 1.12版本,系统自带的1.13有点小bug,需要修改,不然后期容器网络通讯会不通

1

2

3

4

5

6

7

8

9

10

11

12

13

[root@k8s-master ~]# yum provides docker

Loaded plugins: fastestmirror

Determining fastest mirrors

* base: mirrors.aliyun.com

* extras: mirrors.aliyun.com

* updates: mirrors.aliyun.com

2:docker-1.13.1-102.git7f2769b.el7.centos.x86_64 : Automates deployment of

: containerized applicat

Repo : extras

2:docker-1.13.1-103.git7f2769b.el7.centos.x86_64 : Automates deployment of

: containerized applications

Repo : extras

[root@k8s-master ~]#

去官网找1.12版本docker

http://vault.centos.org/7.4.1708/extras/x86_64/Packages/

需要提前安装 CentOS-Base.repo源

三台机器都需要下载这三个docker包:

http://vault.centos.org/7.4.1708/extras/x86_64/Packages/docker-1.12.6-71.git3e8e77d.el7.centos.x86_64.rpm

http://vault.centos.org/7.4.1708/extras/x86_64/Packages/docker-client-1.12.6-71.git3e8e77d.el7.centos.x86_64.rpm

http://vault.centos.org/7.4.1708/extras/x86_64/Packages/docker-common-1.12.6-71.git3e8e77d.el7.centos.x86_64.rpm

如果之前安装了docker,可先将docker移除。

[root@k8s-node-1 ~]# rpm -qa |grep docker

docker-ce-19.03.3-3.el7.x86_64

docker-ce-cli-19.03.3-3.el7.x86_64

[root@k8s-node-1 ~]# rpm -e docker-ce-19.03.3-3.el7.x86_64

[root@k8s-node-1 ~]# rpm -e docker-ce-cli-19.03.3-3.el7.x86_642

[root@k8s-node-1 ~]# rm -rf /var/lib/docker/* 清空之前docker产生的所有文件。

[root@k8s-node-1 ~]# rm -rf /etc/docker/*

3、在三台都安装docker 1.12(必须要按如下顺序安装,不然可能会报错)

1

2

3

yum localinstall docker-common-1.12.6-71.git3e8e77d.el7.centos.x86_64.rpm -y

yum localinstall docker-client-1.12.6-71.git3e8e77d.el7.centos.x86_64.rpm -y

yum localinstall docker-1.12.6-71.git3e8e77d.el7.centos.x86_64.rpm -y

4、验证docker 是否安装成功

1

2

[root@k8s-master ~]# docker -v

Docker version 1.12.6, build 3e8e77d/1.12.6

5、master节点安装etcd (k8s数据库kv类型存储)原生支持做集群

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

[root@k8s-master ~]# yum install etcd.x86_64 -y

[root@k8s-master ~]# vim /etc/etcd/etcd.conf

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.6.129:2379"

#启动

[root@k8s-master ~]# systemctl start etcd.service

[root@k8s-master ~]# systemctl enable etcd.service

#测试

#set 设置一队键值 数据存储

[root@k8s-master ~]# etcdctl set testdir/testkey0 xujin

Xujin

#get获取

[root@k8s-master ~]# etcdctl get testdir/testkey0

xujin

[root@k8s-master ~]#

#检测集群状态

[root@k8s-master ~]# etcdctl -C http://192.168.6.129:2379 cluster-health

member 8e9e05c52164694d is healthy: got healthy result from http://192.168.6.129:2379

cluster is healthy

[root@k8s-master ~]#

6、master节点安装kubernetes

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

[root@k8s-master ~]# yum install kubernetes-master.x86_64 -y

#修改配置文件如下

[root@k8s-master ~]# vim /etc/kubernetes/apiserver

# The address on the local server to listen to.

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

# The port on the local server to listen on.

KUBE_API_PORT="--port=8080"

# Port minions listen on

KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster

KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.6.129:2379"

# default admission control policies

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,Securi

tyContextDeny,ResourceQuota"

#修改config文件

[root@k8s-master ~]# vim /etc/kubernetes/config

KUBE_MASTER="--master=http://192.168.6.129:8080"

7、启动k8s

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# 启动kube-apiserver

#这个服务用来:接受并响应用户的请求

[root@k8s-master ~]# systemctl enable kube-apiserver.service

[root@k8s-master ~]# systemctl start kube-apiserver.service

#启动 kube-controller-manager

#控制管理器的概念,保证容器存活

#每隔一段时间去扫描容器状态,看有没有死了。

#容器死了,会调度apiserver再起一个新的容器

#保证容器的个数,比如我们设定起三个nginx容器,多了就会杀掉,少了就会起

[root@k8s-master ~]# systemctl enable kube-controller-manager.service

[root@k8s-master ~]# systemctl start kube-controller-manager.service

#启动kube-scheduler

#调度器,选择启动容器的node节点,通俗点就是容器在哪一个节点服务器上面创建

[root@k8s-master ~]# systemctl enable kube-scheduler.service

[root@k8s-master ~]# systemctl start kube-scheduler.service

K8S配置文件详解

apiVersion: v1 # 【必须】版本号
kind: Pod # 【必选】Pod
metadata: # 【必选-Object】元数据
  name: String # 【必选】 Pod的名称
  namespace: String # 【必选】 Pod所属的命名空间
  labels: # 【List】 自定义标签列表
    - name: String
  annotations: # 【List】 自定义注解列表
    - name: String
spec: # 【必选-Object】 Pod中容器的详细定义
  containers: # 【必选-List】 Pod中容器的详细定义
    - name: String # 【必选】 容器的名称
      image: String # 【必选】 容器的镜像名称
      imagePullPolicy: [Always | Never | IfNotPresent] # 【String】 每次都尝试重新拉取镜像 | 仅使用本地镜像 | 如果本地有镜像则使用,没有则拉取
      command: [String] # 【List】 容器的启动命令列表,如果不指定,则使用镜像打包时使用的启动命令
      args: [String] # 【List】 容器的启动命令参数列表
      workingDir: String # 容器的工作目录
      volumeMounts: # 【List】 挂载到容器内部的存储卷配置
        - name: String # 引用Pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称
          mountPath: Sting # 存储卷在容器内mount的绝对路径,应少于512个字符
          readOnly: Boolean # 是否为只读模式,默认为读写模式
      ports: # 【List】 容器需要暴露的端口号列表
        - name: String  # 端口的名称
          containerPort: Int # 容器需要监听的端口号
          hostPort: Int # 容器所在主机需要监听的端口号,默认与containerPort相同。设置hostPort时,同一台宿主机将无法启动该容器的第二份副本
          protocol: String # 端口协议,支持TCP和UDP,默认值为TCP
      env: # 【List】 容器运行前需设置的环境变量列表
        - name: String # 环境变量的名称
          value: String # 环境变量的值
      resources: # 【Object】 资源限制和资源请求的设置
        limits: # 【Object】 资源限制的设置
          cpu: String # CPU限制,单位为core数,将用于docker run --cpu-shares参数
          memory: String # 内存限制,单位可以为MB,GB等,将用于docker run --memory参数
        requests: # 【Object】 资源限制的设置
          cpu: String # cpu请求,单位为core数,容器启动的初始可用数量
          memory: String # 内存请求,单位可以为MB,GB等,容器启动的初始可用数量
      livenessProbe: # 【Object】 对Pod内各容器健康检查的设置,当探测无响应几次之后,系统将自动重启该容器。可以设置的方法包括:exec、httpGet和tcpSocket。对一个容器只需要设置一种健康检查的方法
        exec: # 【Object】 对Pod内各容器健康检查的设置,exec方式
          command: [String] # exec方式需要指定的命令或者脚本
        httpGet: # 【Object】 对Pod内各容器健康检查的设置,HTTGet方式。需要指定path、port
          path: String
          port: Number
          host: String
          scheme: String
          httpHeaders:
            - name: String
              value: String
        tcpSocket: # 【Object】 对Pod内各容器健康检查的设置,tcpSocket方式
          port: Number
        initialDelaySeconds: Number # 容器启动完成后首次探测的时间,单位为s
        timeoutSeconds: Number  # 对容器健康检查的探测等待响应的超时时间设置,单位为s,默认值为1s。若超过该超时时间设置,则将认为该容器不健康,会重启该容器。
        periodSeconds: Number # 对容器健康检查的定期探测时间设置,单位为s,默认10s探测一次
        successThreshold: 0
        failureThreshold: 0
      securityContext:
        privileged: Boolean
  restartPolicy: [Always | Never | OnFailure] # Pod的重启策略 一旦终止运行,都将重启 | 终止后kubelet将报告给master,不会重启 | 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常终止(退出码为0),则不会重启。
  nodeSelector: object # 设置Node的Label,以key:value格式指定,Pod将被调度到具有这些Label的Node上
  imagePullSecrets: # 【Object】 pull镜像时使用的Secret名称,以name:secretkey格式指定
    - name: String
  hostNetwork: Boolean # 是否使用主机网络模式,默认值为false。设置为true表示容器使用宿主机网络,不再使用docker网桥,该Pod将无法在同一台宿主机上启动第二个副本
  volumes: # 【List】 在该Pod上定义的共享存储卷列表
    - name: String # 共享存储卷的名称,volume的类型有很多emptyDir,hostPath,secret,nfs,glusterfs,cephfs,configMap
      emptyDir: {} # 【Object】 类型为emptyDir的存储卷,表示与Pod同生命周期的一个临时目录,其值为一个空对象:emptyDir: {}
      hostPath: # 【Object】 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
        path: String # Pod所在主机的目录,将被用于容器中mount的目录
      secret: # 【Object】类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
        secretName: String
        items:
          - key: String
            path: String
      configMap: # 【Object】 类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
        name: String
        items:
          - key: String
            path: String

你可能感兴趣的:(java,java,开发语言)