K8s操作手册(安装与使用)
文章目录1. 简单概述1.1 k8s是什么?1.2 组件说明1.3 k8s中的三种IP2. 环境配置2.1 关闭防火墙2.2 查看内核版本2.3 内核升级(3.10 -> 4.4)2.4 重启2.5 移除无效内核2.6 安装kernel-tools查看安装结果3. 安装k8s单机集群3.1 安装etcd跟k8s3.2 修改配置3.3 修复镜像无法下载问题3.4 启动3.5 基本操作4. 通过
·
1. 简单概述
1.1 k8s是什么?
基于容器技术的分布式集群
为应用提供部署运行,资源调度,服务发现,动态伸缩
使应用安全,高可用,负载均衡,滚动升级,在线扩缩容
1.2 组件说明
etcd
: 存储pods信息与服务发现flannel
: 网络结构支持。后期用CNI,单机部署可以用容器的docker0网络kube-apiserver
: 增删改查的唯一入口,如kubectl操作k8s。与etcd进行通信,持久化存储kube-controller-manager
: 控制器,通过资源对象RC/RS/Deployment上定义的Label Selector来控制要监控的Pod的数量kube-scheduler
: 调度器,调度Pod到node节点kubelet
: 负责容器(docker)的创建,启停,销毁kube-proxy
: 通信与负载均衡,通过Service的Label Selector来选择对应的Pod,建立起Service与Pod的请求转发路由表,从而实现Service的智能负载均衡
1.3 k8s中的三种IP
Node IP
:Node节点的IP地址Pod IP
: Pod的IP地址Cluster IP
:Service的IP地址
2. 安装前的环境配置
2.1 关闭防火墙
#关闭 firewalld
systemctl stop firewalld && systemctl disable firewalld
#关闭 selinux
setenforce 0
#selinux设置为disabled
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2.2 查看内核版本
uname -r
2.3 内核升级(3.10 -> 4.4)
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-lt -y
cat /boot/grub2/grub.cfg | grep menuentry
grub2-set-default 'CentOS Linux (4.4.177-1.el7.elrepo.x86_64) 7 (Core)'
2.4 重启
reboot
# 内核确认
uname -r
2.5 移除无效内核
yum remove -y kernel*
yum remove -y kernel-tools-libs
2.6 安装kernel-tools
#此处增加了--skip-broken参数
yum --enablerepo=elrepo-kernel install --skip-broken -y kernel-lt-headers kernel-lt-tools kernel-lt-devel
yum --enablerepo=elrepo-kernel install -y perf python-perf
2.7 查看安装结果
rpm -qa | grep kernel
输出如下:
kernel-lt-tools-libs-4.4.177-1.el7.elrepo.x86_64
kernel-lt-4.4.177-1.el7.elrepo.x86_64
kernel-lt-tools-4.4.177-1.el7.elrepo.x86_64
kernel-lt-devel-4.4.177-1.el7.elrepo.x86_64
kernel-lt-headers-4.4.177-1.el7.elrepo.x86_64
3. 安装与使用k8s单机集群
3.1 安装etcd和k8s
yum -y update && yum -y install etcd kubernetes
3.2 修改配置
#修改/etc/kubernetes/kubelet
vim /etc/kubernetes/kubelet
## 修改为下面的配置
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.cn-shanghai.aliyuncs.com/google-containers/pause-amd64:3.0"
#修改/etc/kubernetes/apiserver
vim /etc/kubernetes/apiserver
# 修改为下面的配置
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
3.3 修复镜像无法下载问题
yum install -y *rhsm*
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
3.4 启动
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
3.5 基本操作
- 通过kubectl命令行创建一个应用
#运行一个nginx应用
kubectl run my-nginx --image=nginx --replicas=2 --port=80
- 列出pods
kubectl get pods
- 或者rs,列出deployment(部署)
kubectl get deployments
- 扩展,减少pods
kubectl scale deployment/my-nginx --replicas=5
kubectl scale deployment/my-nginx --replicas=2
- 列出pods的详细信息
kubectl describe pods my-nginx-756fb87568-kxb6w
- 删除pods,由于replicas机制,pod会生成一个新的
kubectl delete pods my-nginx-756fb87568-kxb6w
- 删除部署,即彻底删除pods
kubectl delete deployments my-nginx
- 如果删除了部署,发现pods还存在
kubectl delete pods my-nginx-756fb87568-kxb6w --force --grace-period=0
4. 创建应用并暴露服务
4.1 yaml+命令行方式创建
通过yaml 文件创建应用,通过命令行方式,将服务暴露出去
4.1.1 新建nginx-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: my-nginx
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
4.1.2 通过yaml文件创建应用
kubectl create -f nginx-rc.yaml
4.1.3 根据yaml文件删除应用
kubectl delete -f nginx-rc.yaml
4.1.4 创建Service供集群外访问
#创建services
kubectl expose rc/my-nginx --type="NodePort" --port 80
#查看services
kubectl get services
#显示services详细
kubectl describe services my-nginx
#删除services
kubectl delete services my-nginx
5.2 通过yaml文件创建应用并暴露服务
5.2.1 新建nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
selector:
app: nginx
5.2.2 创建服务
# 创建服务
kubectl create -f nginx-svc.yaml
#查看services
kubectl get services
#显示services详细
kubectl describe services my-nginx
注释:
1.type 默认为ClusterIP,不能分配外部端口,一般外部访问有NodePort、LoadBalancer 和 Ingress,各有优缺点,Nodeport端口范围为30000-32767
2.ReplicaSet(RS)是Replication Controller(RC)的升级版本,RS是由RC(已淘汰) 演化而来,RS支持基于集合的标签,RC仅支持基于等式的标签。deployment 是带版本控制的 rs,可以回滚
6. 附录
6.1 etcdctl常用命令:(pods存在etcd中)
6.1.1 数据库操作
# 显示查看,经常会使用此命令,etcdctl ls /registry/../../..
etcdctl ls
# 指定键值
etcdctl set /testdir/testkey "Hello world"
# 获取
etcdctl get /testdir/testkey
# 更新
etcdctl update /testdir/testkey "Hello"
# 删除
etcdctl rm /testdir/testkey
# 键不存在,则创建一个新的键值
etcdctl mk /testdir/testkey "Hello world"
# 键目录不存在,则创建一个新的键目录
etcdctl mkdir testdir2
# 目录不存在就创建,如果目录存在更新目录
etcdctl setdir testdir3
# 更新目录
etcdctl updatedir testdir2
# 删除目录
etcdctl rmdir dir1
6.1.2 非数据库操作
# 备份
etcdctl backup --data-dir /var/lib/etcd --backup-dir /home/etcd_backup
# 监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出
etcdctl watch testdir/testkey
# 监测一个键值的变化,一旦键值发生更新,就执行给定命令。
etcdctl exec-watch testdir/testkey -- sh -c 'ls'
# 通过list、add、remove命令列出、添加、删除etcd实例到etcd集群中。
etcdctl member list
etcdctl member remove 8e9e05c52164694d
etcdctl member add node3 http://ip:2380
6.2 kubectl get 类别:(带#号注释为常用)
componentstatuses (缩写 cs) #验证集群状态
configmaps (缩写 cm)
daemonsets (缩写 ds)
deployments (缩写 deploy) #获取deplyment状态
endpoints (缩写 ep) #获取endpoints
events (缩写 ev)
horizontalpodautoscalers (缩写 hpa)
ingresses (缩写 ing)
jobs
limitranges (缩写 limits)
namespaces (缩写 ns) #获取namespaces
networkpolicies
nodes (缩写 no) #获取nodes
persistentvolumeclaims (缩写 pvc)
persistentvolumes (缩写 pv)
pods (缩写 po) #获取pods
podsecuritypolicies (缩写 psp)
podtemplates
replicasets (缩写 rs) #获取rs
replicationcontrollers (缩写 rc) #获取rc
resourcequotas (缩写 quota)
secrets
serviceaccounts (缩写 sa)
services (缩写 svc) #获取服务
statefulsets
storageclasses
thirdpartyresources
6.3 yaml文件内容说明:
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中,通过kubectl api-versions进行查看
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: web04-pod #资源的名字,在同一个namespace中必须唯一
labels: #设定资源的标签
k8s-app: apache
version: v1
kubernetes.io/cluster-service: "true"
annotations: #自定义注解列表
- name: String #自定义注解名字
spec: #specification of the resource content 指定该资源的内容
restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器
nodeSelector: #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
- name: web04-pod #容器的名字
image: web:apache #容器使用的镜像地址
imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
# Always,每次都检查
# Never,每次都不检查(不管本地是否有)
# IfNotPresent,如果本地有就不检查,如果没有就拉取
command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT
args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数
env: #指定容器中的环境变量
- name: str #变量的名字
value: "/etc/run.sh" #变量的值
resources: #资源管理
requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 32Mi #内存使用量
limits: #资源限制
cpu: 0.5
memory: 32Mi
ports:
- containerPort: 80 #容器开发对外的端口
name: httpd #名称
protocol: TCP
livenessProbe: #pod内容器健康检查的设置
httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常
path: / #URI地址
port: 80
#host: 127.0.0.1 #主机地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 #检测的超时时间
periodSeconds: 15 #检查间隔时间
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: //通过tcpSocket检查健康
# port: number
lifecycle: #生命周期管理
postStart: #容器运行之前运行的任务
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop: #容器关闭之前运行的任务
exec:
command: ['service httpd stop']
volumeMounts:
- name: volume #挂载设备的名字,与volumes[*].name 需要对应
mountPath: /data #挂载到容器的某个路径下
readOnly: True
volumes: #定义一组挂载设备
- name: volume #定义一个挂载设备的名字
#meptyDir: {}
hostPath:
path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种
更多推荐
已为社区贡献2条内容
所有评论(0)