k8s容器编排

2020-03-06  本文已影响0人  唯爱熊

1.k8s集群的安装(kubeadm安装)

1.1 k8s的架构

从系统架构来看,k8s分为2个节点

Master 控制节点 指挥官
Node 工作节点 干活的

1.Master节点组成

API Server :提供k8s API接口
主要处理Rest操作以及更新Etcd中的对象
是所有资源增删改查的唯一入口。

Scheduler:资源调度器
根据etcd里的节点资源状态决定将Pod绑定到哪个Node上

Controller Manager
负责保障pod的健康存在
资源对象的自动化控制中心,Kubernetes集群有很多控制器。

Etcd
这个是Kubernetes集群的数据库
所有持久化的状态信息存储在Etcd中

2.Node节点的组成

Docker Engine
负责节点容器的管理工作,最终创建出来的是一个Docker容器。

kubelet
安装在Node上的代理服务,用来管理Pods以及容器/镜像/Volume等,实现对集群对节点的管理。

kube-proxy
安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。

除了核心组件,还有一些推荐的Add-ons:

组件名称 说明
kube-dns 负责为整个集群提供DNS服务
Ingress Controller 为服务提供外网入口
Heapster 提供资源监控
Dashboard 提供GUI
Federation 提供跨可用区的集群
Fluentd-elasticsearch 提供集群日志采集、存储与查询

1.2实验环境准备

1.初始化操作:
干净环境
配置主机名
配置host解析
关闭防火墙
关闭SELinux
配置时间同步
更新好阿里源
确保网络通畅
关闭SWAP分区
2.配置信息:
主机名 IP地址 推荐配置
node1 10.0.0.11 1C4G40G
node2 10.0.0.12 1C4G40G
node3 10.0.0.13 1C4G40G
所有节点需要做hosts解析

[root@node1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 node1
10.0.0.12 node2
10.0.0.13 node3

1.3 安装指定版本的docker

1.配置阿里源

cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.下载指定版本的docker

yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7

3.配置docker镜像加速

mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
    {
      "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
EOF

4.启动

systemctl enable docker && systemctl start docker

5.检查版本

docker -v

1.4部署kubeadm和kubelet

注意:所有节点都需要安装
1.设置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=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

2.安装kubeadm

yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 ipvsadm

3.设置k8s禁止使用swap

cat > /etc/sysconfig/kubelet<<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF

4.设置内核参数

cat >  /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
#加载生效
sysctl --system

5.设置kubelet开机启动

systemctl enable kubelet && systemctl start kubelet

6.加载IPVS模块

cat >/etc/sysconfig/modules/ipvs.modules<<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#添加可执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
#加载模块
source /etc/sysconfig/modules/ipvs.modules
#检测结果
[root@node1 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145497  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4      15053  2 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
nf_conntrack          133095  7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack

1.5初始化集群部署Master

注意!只在master节点运行!!!
https://v1-16.docs.kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
0.安装规划
节点规划
node1 master节点 API Server controlle scheduler kube-proxy etcd
node2
node3

IP规划
POD IP. 10.2.0.0
Cluster IP. 10.1.0.0
Node IP. 10.0.0.0

1.初始化命令

kubeadm init \
--apiserver-advertise-address=10.0.0.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.16.2 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU

执行完成后会有输出,这是node节点加入k8s集群的命令

kubeadm join 10.0.0.11:6443 --token 24yya0.hwl78tnxu6sc4c3z
--discovery-token-ca-cert-hash sha256:3a31131cf8752bdebe67e1539ad7a625b94e5017b37c0ae8d7f877799b962627

===============================================

2.为kubectl准备kubeconfig

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.获取node节点信息

[root@node1 ~]# kubectl get nodes
NAME    STATUS     ROLES    AGE   VERSION
node1   NotReady   master   15m   v1.16.

4.支持命令补全

yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
kubectl completion bash >/etc/bash_completion.d/kubectl

5.设置kube-proxy使用ipvs模式

执行命令,然后将mode: ""修改为mode: "ipvs"然后保存退出

kubectl edit cm kube-proxy -n kube-system

重启kube-proxy(删除kube-proxy,重新创建,类似修改重载服务)

kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'

查看pod信息

kubectl get -n kube-system pod|grep "kube-proxy" 

检查日志,如果出现IPVS rr就表示成功

[root@node1 ~]# kubectl -n kube-system logs -f kube-proxy-vzg52
I0305 14:55:27.188416       1 node.go:135] Successfully retrieved node IP: 10.0.0.11
I0305 14:55:27.188451       1 server_others.go:176] Using ipvs Proxier.
W0305 14:55:27.188647       1 proxier.go:420] IPVS scheduler not specified, use rr by default

检查IPVS规则

[root@node1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.0.1:443 rr
  -> 10.0.0.11:6443               Masq    1      0          0         
TCP  10.1.0.10:53 rr
TCP  10.1.0.10:9153 rr
UDP  10.1.0.10:53 rr

1.6 部署网络插件

注意!只在master节点上安装部署!!!

1.部署Flannel网络插件

git clone --depth 1 https://github.com/coreos/flannel.git

2.修改资源配置清单

cd flannel/Documentation/
vim kube-flannel.yml
egrep -n "10.2.0.0|mirror|eth0" kube-flannel.yml
128:      "Network": "10.2.0.0/16",
172:        image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
186:        image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
192:        - --iface=eth0

3.应用资源配置清单

kubectl create -f kube-flannel.yml
[root@node1 ~/flannel/Documentation]# kubectl create -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created

4.检查pod运行状态,等一会应该全是running

[root@node1 ~/flannel/Documentation]# kubectl -n kube-system get pod
NAME                            READY   STATUS    RESTARTS   AGE
coredns-58cc8c89f4-bd6gz        0/1     Running   0          48m
coredns-58cc8c89f4-jbgss        1/1     Running   0          48m
etcd-node1                      1/1     Running   0          47m
kube-apiserver-node1            1/1     Running   0          47m
kube-controller-manager-node1   1/1     Running   0          47m
kube-flannel-ds-amd64-ct5tn     1/1     Running   0          34s
kube-proxy-vzg52                1/1     Running   0          15m
kube-scheduler-node1            1/1     Running   0          47m

1.7部署Node节点

1.在master节点上输出增加节点的命令

kubeadm token create --print-join-command

2.在node2和node3节点执行加入集群的命令 每个人的token不一样

kubeadm join 10.0.0.11:6443 --token 24yya0.hwl78tnxu6sc4c3z
--discovery-token-ca-cert-hash sha256:3a31131cf8752bdebe67e1539ad7a625b94e5017b37c0ae8d7f877799b962627
===============================================
3.在node1节点上查看状态

[root@node1 ~]# kubectl get nodes
NAME    STATUS     ROLES    AGE   VERSION
node1   Ready      master   53m   v1.16.2
node2   NotReady   <none>   47s   v1.16.2
node3   Ready      <none>   42s   v1.16.2

4.给节点打标签
主节点操作:

[root@node1 ~]# kubectl label nodes node2 node-role.kubernetes.io/node=
node/node2 labeled
[root@node1 ~]# kubectl label nodes node3 node-role.kubernetes.io/node=
node/node3 labeled

5.再次查看节点状态

[root@node1 ~]# kubectl get nodes
NAME    STATUS     ROLES    AGE     VERSION
node1   Ready      master   55m     v1.16.2
node2   NotReady   node     2m42s   v1.16.2
node3   Ready      node     2m37s   v1.16.2

至此k8s集群搭建完成,这种黑盒安装不利于了解其组成架构,不利于学习,学习还是使用yum一步步安装。

1.8配置master为镜像仓库

安装docker

1.配置阿里源

cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.下载指定版本的docker

yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7

3.配置docker镜像加速

mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
    {
      "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
EOF

4.启动

systemctl enable docker && systemctl start docker

5.检查版本

docker -v
安装harbor

1.下载harbor

wget https://github.com/goharbor/harbor/releases/download/v1.9.3/harbor-offline-installer-v1.9.3.tgz

2.在node4上安装harbor

cd /opt/
tar zxf harbor-offline-installer-v1.9.0-rc1.tgz
cd harbor/

3.编辑harbor配置文件

vim harbor.yml
...
hostname: 10.0.0.14
harbor_admin_password: 123456
data_volume: /data/harbor
...

4.执行安装

yum install docker-compose -y
./install.sh

5.浏览器访问

http://10.0.0.14
admin
123456

6.建立镜像仓库
这里有2种访问级别:
公开:任何人都可以直接访问并下载镜像
私有:登陆授权后才允许下载镜像


.使用harbor作为k8s私有仓库

1.创建镜像仓库


2.所有节点都配置docker信任harbor仓库并重启docker

cat >/etc/docker/daemon.json <<EOF
    {
      "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"],
      "insecure-registries" : ["http://10.0.0.14"]
    }
EOF
systemctl restart docker

3.为镜像打标签

[root@node2 ~]# docker tag d5cea958d330 10.0.0.14/k8s/mysql:5.7
[root@node2 ~]# docker tag a29e200a18e9 10.0.0.14/k8s/tomcat-app:v1

4.登录harbor并推送镜像到harbor

[root@node2 ~]# docker login 10.0.0.14
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@node2 ~]# docker push 10.0.0.14/k8s/tomcat-app:v1
The push refers to repository [10.0.0.14/k8s/tomcat-app]
fe9a890c4f24: Pushed 
5f70bf18a086: Pushed 
a072f755a133: Pushed 
6d0267f8a9fd: Pushed 
7bb92eb08c02: Pushed 
d8ba5f179687: Pushed 
2275023dea33: Pushed 
d490458a60cb: Pushed 
bb3e02b5a488: Pushed 
3b7a0c95e085: Pushed 
02adacdfda2f: Pushed 
d2c5e3a8d3d3: Pushed 
4dcab49015d4: Pushed 
v1: digest: sha256:565bb4e52ac67b4d37feed9ea4626b786f23e0871451587c7187683532a6188f size: 5719
[root@node2 ~]# docker push 10.0.0.14/k8s/mysql:5.7
The push refers to repository [10.0.0.14/k8s/mysql]
ef78375f166a: Pushed 
549184ef4a0e: Pushed 
3be346044c35: Pushed 
c7c9b9502281: Pushed 
80c697004ac9: Pushed 
f24603cb3885: Pushed 
cee57cdf5101: Pushed 
1a527f11e03e: Pushed 
4dac9b6b28ce: Pushed 
605f8f2fe1e5: Pushed 
e0db3ba0aaea: Pushed 
5.7: digest: sha256:1be1f2cbd2c18563b167ffda45f67c5b0afb1bfe6a77cbc506306836fb1317b5 size: 2622

5.查看docker登陆的密码文件

[root@node1 ~]# cat /root/.docker/config.json
{
    "auths": {
        "10.0.0.14": {
            "auth": "YWRtaW46SGFyYm9yMTIzNDU="
        }
    },
    "HttpHeaders": {
        "User-Agent": "Docker-Client/18.09.7 (linux)"
    }
}

6.将docker密码文件解码成base64编码

[root@node1 ~/demo]# cat /root/.docker/config.json|base64
ewoJImF1dGhzIjogewoJCSIxMC4wLjAuMTQiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVlt
OXlNVEl6TkRVPSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRv
Y2tlci1DbGllbnQvMTguMDkuNyAobGludXgpIgoJfQp9

7.创建并应用docker登陆的Secret资源
注意!!!
1.dockerconfigjson: xxx直接写base64的编码,不需要换行
2.base64编码是一整行,不是好几行
3.最后的type字段不能少

[root@node1 ~]# vim harbor-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: harbor-secret
data:
 .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxMC4wLjAuMTQiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVlt
OXlNVEl6TkRVPSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRv
Y2tlci1DbGllbnQvMTguMDkuNyAobGludXgpIgoJfQp9
type: kubernetes.io/dockerconfigjson

8.应用资源配置清单并查看

[root@node1 ~]# kubectl create -f harbor-secret.yaml
secret/harbor-secret created
[root@node1 ~]# kubectl get secrets 
NAME                  TYPE                                  DATA   AGE
default-token-vz4d9   kubernetes.io/service-account-token   3      30h
harbor-secret         kubernetes.io/dockerconfigjson        1      14s

2什么是k8s,k8s有什么功能?

k8s是一个docker集群的管理工具

2.1 k8s的核心功能

自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。

弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量

服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。

滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。

2.2 k8s的历史

2014年 docker容器编排工具,立项

2015年7月 发布kubernetes 1.0, 加入cncf基金会

2016年,kubernetes干掉两个对手,docker swarm,mesos 1.2版

2017年 1.5

2018年 k8s 从cncf基金会 毕业项目

2019年: 1.13, 1.14 ,1.15

cncf cloud native compute foundation

kubernetes (k8s): 希腊语 舵手,领航 容器编排领域,

谷歌15年容器使用经验,borg容器管理平台,使用golang重构borg,kubernetes

2.3 k8s的安装

yum安装 1.5 最容易安装成功,最适合学习的

源码编译安装---难度最大 可以安装最新版

二进制安装---步骤繁琐 可以安装最新版 shell,ansible,saltstack

kubeadm 安装最容易, 网络 可以安装最新版

minikube 适合开发人员体验k8s, 网络

2.4 k8s的应用场景

k8s最适合跑微服务项目!

3k8s常用的资源

1.POD
POD是k8s的最小资源单位
POD的IP地址是随机的,删除POD会改变IP
POD都有一个基础容器
一个POD内可以由一个或多个容器组成
一个POD内的容器共享根容器的网络命名空间
一个POD的内的网络地址由根容器提供

2.Controller
用来管理POD
控制器的种类有很多

3.Service提供网络代理负债均衡
NodeIP
CluterIP
POD IP

3.1 创建pod资源

创建资源的方法
apiserver仅能接受json格式的资源定义 ,yaml格式提供的清单,apiserver可以自动将其转换为json格式再提交。
k8s yaml的主要组成:

#查看资源清单所需的字段
[root@node1 ~]# kubectl explain pod

apiVersion: v1  api版本
kind: pod   资源类型
metadata:   属性
spec:       详细
#查看资源清单嵌套的命令
  kubectl explain pod
  kubectl explain pod.spec
  kubectl explain pod.spec.volumes

使用命令行创建一个pod

#创建pod
kubectl create deployment nginx --image=nginx:alpine
#查看pod详细信息
kubectl get pod -o wide
#将刚才创建的pod配置到处成yaml格式
kubectl get pod -o yaml > nginx-pod.yaml
[root@node1 ~]# vim nginx-pod.yaml
apiVersion: v1  #api版本
kind: Pod   #资源类型
metadata:   #元数据
  name: nginx   #元数据名称
  labels:   #pod标签
    app: nginx   
spec:       
  containers:   #容器的特性
  - name: nginx #容器名称
    image: nginx:alpine #容器的镜像名称
    imagePullPolicy: IfNotPresent  #容器的拉取策略
    ports:      #容器端口
    - name: http 
      containerPort: 80  #容器暴露的端口

根据应用资源配置清单创建pod

kubectl create -f nginx-pod.yaml

查看pod信息

kubectl get pod -o wide

查看pod创建过程的详细信息

kubectl describe pod nginx

pod资源:至少由两个容器组成,pod基础容器和业务容器组成(最多1+4)
pod配置文件2:

apiVersion: v1
kind: Pod
metadata:
  name: test
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 10.0.0.14/nginx:1.14
      ports:
        - containerPort: 80
    - name: busybox
      image: 10.0.0.14/busybox:latest
      command: ["sleep","10000"] #间隔时间

Node打标签

说明:通过nodeSelector来选择node标签在特定节点生成pod,默认是根据etcd里的节点资源状态决定将Pod绑定到哪个Node上。

1.查看node的标签

kubectl get node --show-labels

2.给node打标签

kubectl label nodes node2 CPU=Xeon
kubectl label nodes node3 disktype=ssd

3.编辑POD资源配置清单,使用node标签选择器

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.0
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
  nodeSelector:
    #CPU: Xeon
    disktype: SSD

4.删除容器重新创建

kubectl delete pod nginx
kubectl create -f nginx-pod.yaml

5.查看结果

kubectl get pod -o wide

6.删除节点标签

kubectl label nodes node2 CPU-
kubectl label nodes node3 disktype-

容器打标签

1.标签说明
一个标签可以给多个POD使用
一个POD也可以拥有多个标签

2.查看POD标签

  kubectl get pod --show-labels

3.添加标签方法
方法1:直接编辑资源配置清单:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
    release: beta

方法2:命令行打标签

kubectl label pods nginx release=beta
kubectl label pods nginx job=linux
kubectl get pod --show-labels  

4.删除标签

kubectl label pod nginx job- 
kubectl get pod --show-labels

5.实验: 生成2个POD,打上不同的标签,然后根据标签选择

kubectl create deployment nginx --image=nginx:1.14.0
kubectl get pod --show-labels
kubectl label pods nginx-xxxxxxxx release=stable
kubectl get pod --show-labels

根据条件查看

kubectl get pods -l release=beta --show-labels 
kubectl get pods -l release=stable --show-labels 

根据条件删除

kubectl delete pod -l app=nginx

3.2 ReplicationController资源

rc:保证指定数量的pod始终存活,rc通过标签选择器来关联pod

k8s资源的常见操作:

kubectl create -f xxx.yaml 
kubectl get pod|rc 
kubectl describe pod nginx 
kubectl delete pod nginx 或者kubectl delete -f xxx.yaml
kubectl edit pod nginx

创建一个rc

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 5
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: 10.0.0.14/nginx:1.14
        ports:
        - containerPort: 80

rc的滚动升级 新建一个nginx-rc1.15.yaml

升级 kubectl rolling-update nginx -f nginx-rc1.15.yaml --update-period=10s

回滚 kubectl rolling-update nginx2 -f nginx-rc.yaml --update-period=1s


3.3.编写RS控制器资源配置清单

cat >nginx-rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
  namespace: default
spec:
  replicas: 2 
  selector: 
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-pod
      labels: 
        app: nginx
    spec:
      containers:
      - name: nginx-containers
        image: nginx:1.14.0
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
EOF

2.应用RS资源配置清单

kubectl create -f nginx-rs.yaml

3.查看RS资源

kubectl get rs 
kubectl get pod -o wide 

4.动态修改配置 扩容 收缩 升级

kubectl edit rs nginx
kubectl scale rs nginx --replicas=5

5.修改yaml文件应用修改

vim nginx-rs.yaml
kubectl apply -f nginx-rs.yaml

3.4deployment资源

有rc在滚动升级之后,会造成服务访问中断,这是由于调用的标签需要手动修改,于是k8s引入了deployment资源,也是目前使用的pod资源。
1.Deployment资源配置清单

cat >nginx-dp.yaml<<EOF
apiVersion: apps/v1
kind: Deployment 
metadata:
  name: nginx-deployment 
  namespace: default
spec:
  replicas: 2 
  selector: 
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-pod
      labels: 
        app: nginx
    spec:
      containers:
      - name: nginx-containers
        image: nginx:1.14.0
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
EOF

2.应用资源配置清单

kubectl create -f nginx-dp.yaml

3.查看

kubectl get pod -o wide
kubectl get deployments.apps
kubectl describe deployments.apps nginx-deployment

4.更新版本
方法1: 命令行根据资源配置清单修改镜像

kubectl set image -f nginx-dp.yaml nginx-containers=nginx:1.16.0

查看有没有更新

kubectl get pod 
kubectl describe deployments.apps nginx-deployment
kubectl describe pod nginx-deployment-7c596b4d95-6ztld

方法2: 命令行根据资源类型修改镜像
打开2个窗口:
第一个窗口监控pod状态

kubectl get pod -w

第二个窗口更新操作

kubectl set image deployment nginx-deployment nginx-containers=nginx:1.14.0

查看更新后的deployment信息

kubectl describe deployments.apps nginx-deployment 
----------------------------------------------------
  Normal  ScalingReplicaSet  14m                  deployment-controller  Scaled up replica set nginx-deployment-7c596b4d95 to 1
  Normal  ScalingReplicaSet  14m                  deployment-controller  Scaled down replica set nginx-deployment-9c74bb6c7 to 1
  Normal  ScalingReplicaSet  14m                  deployment-controller  Scaled up replica set nginx-deployment-7c596b4d95 to 2
  Normal  ScalingReplicaSet  13m                  deployment-controller  Scaled down replica set nginx-deployment-9c74bb6c7 to 0
  Normal  ScalingReplicaSet  8m30s                deployment-controller  Scaled up replica set nginx-deployment-9c74bb6c7 to 1
  Normal  ScalingReplicaSet  8m29s (x2 over 32m)  deployment-controller  Scaled up replica set nginx-deployment-9c74bb6c7 to 2
  Normal  ScalingReplicaSet  8m29s                deployment-controller  Scaled down replica set nginx-deployment-7c596b4d95 to 1
  Normal  ScalingReplicaSet  8m28s                deployment-controller  Scaled down replica set nginx-deployment-7c596b4d95 to 0
----------------------------------------------------

更新过程:

nginx-deployment-7c596b4d95-8z7kf   #老的版本
nginx-deployment-7c596b4d95-6ztld   #老的版本

nginx-deployment-9c74bb6c7-pgfxz    0/1     Pending   
nginx-deployment-9c74bb6c7-pgfxz    0/1     Pending
nginx-deployment-9c74bb6c7-pgfxz    0/1     ContainerCreating  #拉取新版本镜像
nginx-deployment-9c74bb6c7-pgfxz    1/1     Running            #运行新POD
nginx-deployment-7c596b4d95-8z7kf   1/1     Terminating        #停止一个旧的POD
nginx-deployment-9c74bb6c7-h7mk2    0/1     Pending            
nginx-deployment-9c74bb6c7-h7mk2    0/1     Pending           
nginx-deployment-9c74bb6c7-h7mk2    0/1     ContainerCreating  #拉取新版本镜像
nginx-deployment-9c74bb6c7-h7mk2    1/1     Running            #运行新POD
nginx-deployment-7c596b4d95-6ztld   1/1     Terminating        #停止一个旧的POD
nginx-deployment-7c596b4d95-8z7kf   0/1     Terminating        #等待旧的POD结束
nginx-deployment-7c596b4d95-6ztld   0/1     Terminating        #等待旧的POD结束

查看滚动更新状态:

kubectl rollout status deployment nginx-deployment

5.回滚上一个版本

kubectl describe deployments.apps nginx-deployment 
kubectl rollout undo deployment nginx-deployment
kubectl describe deployments.apps nginx-deployment 

6.回滚到指定版本
v1 1.14.0
v2 1.15.0
v3 1.16.0
回滚到v1版本

创建第一版 1.14.0

kubectl create -f nginx-dp.yaml  --record

更新第二版 1.15.0

kubectl set image deployment nginx-deployment nginx-containers=nginx:1.15.0

更新第三版 1.16.0

kubectl set image deployment nginx-deployment nginx-containers=nginx:1.16.0

查看所有历史版本

kubectl rollout history deployment nginx-deployment

查看指定历史版本信息

kubectl rollout history deployment nginx-deployment --revision=1

回滚到指定版本

kubectl rollout undo deployment nginx-deployment --to-revision=1

7.扩缩容

kubectl scale deployment nginx-deployment --replicas=5
kubectl scale deployment nginx-deployment --replicas=2

k8s的附加组件

4.1namespace命令空间

namespace做资源隔离

说明:根据业务名命令空间名,默认的事default。命令空间不同,资源名相同也不会冲突

ubectl create namespace 空间名称

4.2 健康检查

4.2.1 探针的种类

livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器

readinessProbe:可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除

4.2.2 探针的检测方法

4.2.3 liveness探针的exec使用

vi  nginx_pod_exec.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: exec
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
      args:
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
      livenessProbe:
        exec:
          command:
            - cat
            - /tmp/healthy
        initialDelaySeconds: 5   
        periodSeconds: 5
#创建pod
[root@node1 ~]# kubectl create -f nginx-pod-exec.yaml
#持续查看结果
[root@node1 ~]# kubectl get pods exec
NAME   READY   STATUS    RESTARTS   AGE
exec   1/1     Running   1          74s

4.2.4 liveness探针的httpGet使用

vi   nginx_pod_httpGet.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: httpget
spec:
  containers:
    - name: nginx
      image: 10.0.0.14/k8s/nginx:1.14
      ports:
        - containerPort: 80
      livenessProbe:
        httpGet:
          path: /index.html
          port: 80
        initialDelaySeconds: 3
        periodSeconds: 3

创建pod

[root@node1 ~]# kubectl create -f nginx_pod_httpGet.yaml
pod/httpget created

查看创建结果

[root@node1 ~]# kubectl get pod httpget
NAME      READY   STATUS    RESTARTS   AGE
httpget   1/1     Running   0          52s

进入pod 删除首页

[root@node1 ~]# kubectl exec -it httpget /bin/bash
root@httpget:/# cd usr/share/nginx/html/
root@httpget:/usr/share/nginx/html# ls
50x.html  index.html
root@httpget:/usr/share/nginx/html# rm -rf index.html 
root@httpget:/usr/share/nginx/html# exit

测试结果(也可以通过查看创建pod过程)

[root@node1 ~]# kubectl get pod httpget
NAME      READY   STATUS    RESTARTS   AGE
httpget   1/1     Running   1          3m5s

4.2.5 liveness探针的tcpSocket使用

vi   nginx_pod_tcpSocket.yaml
apiVersion: v1
kind: Pod
metadata:
  name: tcpSocket
spec:
  containers:
    - name: nginx
      image: 10.0.0.14/k8s/nginx:1.14
      ports:
        - containerPort: 80
      livenessProbe:
        tcpSocket:
          port: 80
        initialDelaySeconds: 3
        periodSeconds: 3

4.3.6 readiness探针的httpGet使用

vi   nginx-rc-httpGet.yaml
iapiVersion: v1
kind: ReplicationController
metadata:
  name: readiness
spec:
  replicas: 2
  selector:
    app: readiness
  template:
    metadata:
      labels:
        app: readiness
    spec:
      containers:
      - name: readiness
        image: 10.0.0.14/k8s/nginx:1.14
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /test.html
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 3

创建pod

[root@node1 ~/health]# kubectl create -f nginx-rc-httpGet.yaml
replicationcontroller/readiness created

查看创建结果


健康监测,创建test.html文件

[root@node1 ~/health]# kubectl exec -it readiness-29f9d /bin/bahs
OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"/bin/bahs\": stat /bin/bahs: no such file or directory": unknown
command terminated with exit code 126
[root@node1 ~/health]# kubectl exec -it readiness-29f9d /bin/bash
root@readiness-29f9d:/# touch /usr/share/nginx/html/test.html
root@readiness-29f9d:/# exit
exit

查看结果


上一篇 下一篇

猜你喜欢

热点阅读