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
控制器的种类有很多
- RC Replication Controller 控制POD有多个副本
- RS ReplicaSet RC控制的升级版
- Deployment 推荐使用,功能更强大,包含了RS控制器
- DaemonSet 保证所有的Node上有且只有一个Pod在运行
- StatefulSet 有状态的应用,为Pod提供唯一的标识,它可以保证部署和scale的顺序
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 探针的检测方法
- exec:执行一段命令
- httpGet:检测某个 http 请求的返回状态码
- tcpSocket:测试某个端口是否能够连接
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
查看结果