快速简单的了解k8s
k8s 是什么?官方解释:Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。这个问题可能很多人都有,所以我先说下我对k8s的理解:k8s可以自动部署docker容器k8s具有弹性伸缩功能, 能根据使用情况扩展和收缩容器规模k8s提供了容器间的负载...
这个是一个非常简单的教程, 只是帮助对k8s有一个大概的概念
k8s 是什么?
官方解释:Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
这个问题可能很多人都有,所以我先说下我对k8s的理解:
- k8s可以自动部署docker容器
- k8s提供了容器间的负载均衡功能
- k8s具有弹性伸缩功能, 能根据使用情况扩展和收缩容器规模
- k8s还能监控各容器情况, 即时故障发现, 自动替换成新的容器【主备功能】
- k8s的某个node(服务器)【硬件或者网络】出问题了, 可以在其他node上创建新的容器, 保证容器数和设置的一致
所以k8s一个对docker容器做cd(自动化交付)和自动化运维的集群系统【如果理解错误希望指正】。
其实可以理解k8s是一个简版的阿里云
- 通过阿里云选择配置购买ecs服务器(编写k8s脚本部署pod)
- 阿里云可以手动(自动)随时扩展销毁ecs服务器(即k8s弹性收缩)
- 多个服务器下,购买阿里云的负载均衡功能(即k8s提供负载均衡)
- 如果阿里云的ecs服务器出问题了, 会自动替换(即k8s的容器出问题了也会自动替换)
- ecs的应用出问题了, 只能自己手动修复。(k8s有一个容器修复功能)
介绍2个开源的k8s平台
6. KubeOperator
KubeOperator 是一个开源项目,在离线网络环境下,通过可视化 Web UI 在 VMware、Openstack 或者物理机上规划、部署和运营生产级别的 Kubernetes 集群。KubeOperator 是 Jumpserver 明星开源团队在 Kubernetes 领域的的又一全新力作。
Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。
Dashboard 是基于网页的 Kubernetes 用户界面。您可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。您可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源(如 Deployment,Job,DaemonSet 等等)。例如,您可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
快速部署k8s, 只适合学习, 实际环境使用开源的或者自己开发的更好
目前采用的部署方式使用 kubeadmin通过离线镜像安装
环境说明:
- 3台虚拟机
- master 1台 (1核4g30g硬盘)192.168.133.129
- node 2 台 (1核1g20g硬盘)192.168.133.246, 192.168.133.247
- 系统版本: CentOS Linux release 7.5.1804 (Core)
- k8s版本:14.1.1
安装步骤
# 设置时区
[root@localhost ~]# timedatectl set-timezone Asia/Shanghai
# 设置hostname
# 129(192.168.133.129简称)
[root@localhost ~]# hostnamectl set-hostname master
# 246(192.168.133.246简称)
[root@localhost ~]# hostnamectl set-hostname node1
# 247(192.168.133.247简称)
[root@localhost ~]# hostnamectl set-hostname node2
# 修改hosts
[root@localhost kubernetes-1.14]# vim /etc/hosts
# 如下
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.133.129 master
192.168.133.246 node1
192.168.133.247 node2
#关闭防火墙,三台虚拟机都要设置,生产环境跳过这一步
[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@master ~]# setenforce 0
[root@master ~]# systemctl disable firewalld
[root@master ~]# systemctl stop firewalld
# 下载k8s相关镜像
[root@master ~]# mkdir /usr/local/k8s-install
[root@master ~]# cd /usr/local/k8s-install
# 按每个Centos上安装Docker
[root@localhost k8s-install]# tar -zxvf docker-ce-18.09.tar.gz
[root@localhost k8s-install]# cd docker
[root@localhost docker]# yum localinstall -y *.rpm
[root@localhost docker]# systemctl start docker
[root@localhost docker]# systemctl enable docker
# 确保从cgroups均在同一个从groupfs
[root@localhost docker]# docker info | grep cgroup
Cgroup Driver: cgroupfs
# 如果不一致, 请使用以下命令调整
# cat << EOF > /etc/docker/daemon.json
# {
# "exec-opts": ["native.cgroupdriver=cgroupfs"]
# }
# EOF
# systemctl daemon-reload && systemctl restart docker
# 安装kubeadm
# kubeadm是集群部署工具
[root@localhost docker]# cd /usr/local/k8s-install/kubernetes-1.14
[root@localhost kubernetes-1.14]# tar -zxvf kube114-rpm.tar.gz
[root@localhost kubernetes-1.14]# cd kube114-rpm
[root@localhost kube114-rpm]# yum localinstall -y *.rpm
# 关闭交换区
[root@localhost kube114-rpm]# swapoff -a
[root@localhost kube114-rpm]# vim /etc/fstab
# 注释下面这行
#/dev/mapper/centos-swap swap swap defaults 0 0
# 配置网桥
# master 主机操作
[root@localhost kube114-rpm]#cat <<EOF > /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
[root@localhost kube114-rpm]# sysctl --system
# 开启ipv4路由 !!!一定要做, 不然会很坑
[root@node2 kubernetes-1.14]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@node2 kubernetes-1.14]# systemctl restart kubelet
# 通过镜像安装k8s
[root@localhost kube114-rpm]# cd /usr/local/k8s-install/kubernetes-1.14
[root@localhost kubernetes-1.14]# docker load -i k8s-114-images.tar.gz
[root@localhost kubernetes-1.14]# docker load -i flannel-dashboard.tar.gz
# master 主机操作
[root@localhost kubernetes-1.14]# kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16
# 配置config文件
# master 主机操作
[root@localhost kubernetes-1.14]# mkdir -p $HOME/.kube
[root@localhost kubernetes-1.14]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@localhost kubernetes-1.14]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@localhost kubernetes-1.14]# systemctl enable kubelet
[root@localhost kubernetes-1.14]# kubectl apply -f kube-flannel.yml
# 加入节点
# node 上操作
[root@localhost kube114-rpm]# cd kube114-rpm
[root@localhost kube114-rpm]# kubeadm join 192.168.133.129:6443 --token knwurz.s62ayrb5cf98xsjg --discovery-token-ca-cert-hash sha256:bf738c3a3517c0780666ab17b376b8a6dd89c201f76ad6a81bde7f826175d81f
# 启动k8s
# systemctl start/restart/stop kubelet
# 部署完成以后, 每个node都可以跟任何一个pod通信
[root@node2 ~]# ping 10.244.3.11
PING 10.244.3.11 (10.244.3.11) 56(84) bytes of data.
64 bytes from 10.244.3.11: icmp_seq=1 ttl=63 time=0.482 ms
64 bytes from 10.244.3.11: icmp_seq=2 ttl=63 time=0.368 ms
64 bytes from 10.244.3.11: icmp_seq=3 ttl=63 time=0.252 ms
[root@node1 ~]# ping 10.244.1.12
PING 10.244.1.12 (10.244.1.12) 56(84) bytes of data.
64 bytes from 10.244.1.12: icmp_seq=1 ttl=63 time=0.600 ms
64 bytes from 10.244.1.12: icmp_seq=2 ttl=63 time=0.859 ms
64 bytes from 10.244.1.12: icmp_seq=3 ttl=63 time=0.266 ms
[root@master www-data]# ping 10.244.3.11
PING 10.244.3.11 (10.244.3.11) 56(84) bytes of data.
64 bytes from 10.244.3.11: icmp_seq=1 ttl=63 time=0.539 ms
64 bytes from 10.244.3.11: icmp_seq=2 ttl=63 time=0.318 ms
64 bytes from 10.244.3.11: icmp_seq=3 ttl=63 time=0.272 ms
[root@master www-data]# ping 10.244.1.12
PING 10.244.1.12 (10.244.1.12) 56(84) bytes of data.
64 bytes from 10.244.1.12: icmp_seq=1 ttl=63 time=0.655 ms
64 bytes from 10.244.1.12: icmp_seq=2 ttl=63 time=0.280 ms
64 bytes from 10.244.1.12: icmp_seq=3 ttl=63 time=0.409 ms
部署完成以后详细信息
安装问题
- token有效期是24小时,如果超过24小时就需要重建token
# master上操作, 查看token, 如果不存在
[root@master ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
# 新建token
[root@master ~]# kubeadm token create
xylh8a.uqy63nz1rhsd7hge
# 替换到新的token里面执行加入操作
# node上操作
[root@localhost kubernetes-1.14]# kubeadm join 192.168.133.129:6443 --token xylh8a.uqy63nz1rhsd7hge --discovery-token-ca-cert-hash sha256:bf738c3a3517c0780666ab17b376b8a6dd89c201f76ad6a81bde7f826175d81f
#删除node
# master上操作
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 5d20h v1.14.1
node1 NotReady <none> 5d20h v1.14.1
node2 NotReady <none> 5d20h v1.14.1
[root@master ~]# kubectl delete node node1
- 无法访问, 首先确认容器的端口是否填写正确,如果不行试试下面这个方法
# 配置端口转发
[root@node1 ~]# iptables -P FORWARD ACCEPT
[root@node1 ~]# iptables -S
# 查看ip配置是否存在问题
[root@node2 ~]# ip a
# 比如 docker 占用了:
#3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc noqueue state DOWN group default
# link/ether 02:42:5d:e6:cb:e2 brd ff:ff:ff:ff:ff:ff
# inet 172.17.0.1/16 scope global docker0
# valid_lft forever preferred_lft forever
# inet 10.244.0.1/16 scope global docker0
# valid_lft forever preferred_lft forever
# 解决方法
# 删除即可
[root@node2 ~]# ip addr del 10.244.1.0 dev docker0
# 如果是 node的 flannel没有ipv4的地址
# 4: flannel.1: <BROADCAST,MULTICAST> mtu 1450 qdisc noqueue state DOWN group default
# link/ether 62:4d:d1:36:64:95 brd ff:ff:ff:ff:ff:ff
# node 上操作
[root@node2 ~]# ip link delete flannel.1
[root@node2 ~]# systemctl restart network
# master上操作 删除对应的pod, 让k8s重新部署
[root@master ~]# kubectl delete pods kube-flannel-ds-amd64-wtzd7 --namespace=kube-system
- 删除pod
# 删除部署,彻底的所有服务器上的pod
# 查看所有的部署
# master 上操作
[root@master ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
ccctomcat 1/2 2 1 46h
nginx 2/2 2 2 46h
[root@master ~]# kubectl delete service ccctomcat
# 查看服务 CLUSTER-IP 是随机生成的, 文中可能出现ip不一致的情况,是因为排错的时候换了ip,请理解
[root@master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ccctomcat LoadBalancer 10.98.103.126 <pending> 26000:32016/TCP 46h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
nginx LoadBalancer 10.110.116.44 <pending> 8080:32295/TCP 46
# 删除服务
[root@master ~]# kubectl delete service ccctomcat
# --------------------------------
# 删除某个pod, 这个即使删除了, k8s也会重新进行部署新的pod
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
ccctomcat-84689cd9d4-8jxg6 1/1 Running 0 46h
ccctomcat-84689cd9d4-p75ws 1/1 Running 0 46h
nginx-5f98f8ccff-pw7tr 1/1 Running 0 46h
nginx-5f98f8ccff-q4x5z 1/1 Running 0 46h
[root@master ~]# kubectl delete pod ccctomcat-84689cd9d4-8jxg6
pod "ccctomcat-84689cd9d4-8jxg6" deleted
- 不能访问clusterIP
# master 更改proxy-mode=ipvs
[root@node1 ~]# kubectl edit cm kube-proxy -n kube-system
mode: "ipvs"
# node和master是都要做一遍
[root@node1 ~]# 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
[root@node1 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
- 删除 kube-flannel 重新部署
[root@master kubernetes-1.14]# kubectl delete -f kube-flannel.yml
[root@master kubernetes-1.14]# ifconfig cni0 down
[root@master kubernetes-1.14]# ip link delete cni0
[root@master kubernetes-1.14]# ifconfig flannel.1 down
[root@master kubernetes-1.14]# ip link delete flannel.1
[root@master kubernetes-1.14]# rm -rf /var/lib/cni/
[root@master kubernetes-1.14]# rm -f /etc/cni/net.d/*
[root@master kubernetes-1.14]# systemctl restart kubelet
[root@master kubernetes-1.14]# kubectl create -f kube-flannel.yml
提供一些排错命令
- route -n 查看路由表
- tracepath -n ip 追踪路由信息
- ip a 显示IP地址信息
- kubectl get pods -o wide -A 查看pod的信息
- kubectl get service -A 查看service信息
- kubectl get deployment -A 查看部署信息
- kubectl delete pods pod名字 [–namespace=kube-system 指定命名空间,不指定可能提示找不到pod]
- kubectl log pod名字 [–namespace=kube-system 指定命名空间]
使用dashboard
# 开启dashboard webui
# master 上操作
[root@localhost kubernetes-1.14]# kubectl apply -f kubernetes-dashboard.yaml
[root@localhost kubernetes-1.14]# kubectl apply -f admin-role.yaml
[root@localhost kubernetes-1.14]# kubectl apply -f kubernetes-dashboard-admin.rbac.yaml
# 查看web-ui端口
[root@localhost kubernetes-1.14]# kubectl -n kube-system get svc
# 浏览器输入 http://192.168.133.129:32000/#!/overview?namespace=default
使用部署脚本部署nginx,实现数据共享和master负载均衡
- 配置文件共享
# master 操作安装nfs 和 rpcbind
[root@master ~]# yum install -y nfs-utils rpcbind
# 配置共享文件夹 注意不要带空格
[root@master ~]# echo "/usr/local/data/www-data 192.168.16.129/24(rw,sync)" > /etc/exports
# 启动服务并设置开机启动
[root@master ~]# systemctl start nfs.service
[root@master ~]# systemctl start rpcbind.service
[root@master ~]# systemctl enable nfs.service
[root@master ~]# systemctl enable rpcbind.service
# 查看文件夹是否已经设置成功
[root@master ~]# exportfs
/usr/local/data/www-data
192.168.133.129/24
# node上操作
[root@node1 ~]# yum install -y nfs-utils
[root@node1 ~]# vim /etc/fstab
# 添加挂载项
192.168.133.129:/usr/local/data/www-data /mnt nfs4 rw 0 0
# 执行自动挂载
[root@node1 ~]# mount -a
# 查看是否挂载成功
[root@node1 ~]# df
- 创建部署
[root@master ~]# vim nginx.yml
apiVersion: extensions/v1beta1 #默认 说明该文件的版本
kind: Deployment #说明该文件的用途是部署
metadata:
name: nginx-deploy #pod名字
spec: #详细内容
replicas: 2 #部署多少个pod
template:
metadata:
labels:
app: nginx-cluster # pods 标签
spec:
volumes:
- name: web-app # 共享存储卷名称
hostPath:
path: /mnt # 绑定共享的路径
# - name: web-app2 设置第二个挂载卷
# hostPath:
# path: /mnt2 !!不能挂载到/mnt
containers:
- name: nginx-cluster # 容器名字
image: nginx:latest # nginx镜像
resources:
requests: # 最小cpu资源和内存空间
cpu: 0.5
memory: 200Mi
limits: # 最大cpu资源和内存空间
cpu: 1
memory: 512Mi
ports:
- containerPort: 80 # 容器暴露的端口
volumeMounts:
- name: web-app # 对应 volumes的名字
mountPath: /usr/share/nginx/html # 对应容器内部的路径
[root@master ~]# kubectl create -f nginx.yml
- 创建负载均衡服务
[root@master ~]# vim nginx.service.yml
apiVersion: v1 #默认 说明该文件的版本
kind: Service #说明该文件的用途
metadata:
name: nginx-service # 服务名字
labels:
app: nginx-service # 服务名字 自定义标签名字
spec:
#type: NodePort # 配置可以通过节点ip+端口访问
selector:
app: nginx-cluster # 选定 Deployment部署定义的 pod 标签名字, 可通过 kubectl describe pod pod名字 命令查看
ports:
- port: 8000 # pod 暴露的端口
targetPort: 80 # 容器 暴露的端口
#nodePort: 32500 #当前node暴露端口, 可直接通过node的ip:端口访问
# 如果开放了 32500, master+ip也可以访问,也能起到负载均衡的效果。但是这样也开放了 node+ip的访问权限
# 这个就自己做取舍好了
############
# 创建服务
[root@master ~]# kubectl create -f nginx.service.yml
service/nginx-service created
# 查看服务
[root@master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
nginx-service ClusterIP 10.96.242.162 <none> 8000/TCP 28m
- 配置端口转发
#下载 github https://github.com/samhocevar/rinetd
[root@master ~]# tar -xvf rinetd.tar.gz
[root@master ~]# yum install -y unzip
[root@master ~]# unzip rinetd-master.zip
[root@master ~]# cd rinetd-master
[root@master rinetd-master]# sed -i 's/65536/65535/g' src/rinetd.c
[root@master rinetd-master]# yum install -y libtool gcc
[root@master rinetd-master]# ./bootstrap
[root@master rinetd-master]# ./configure
[root@master rinetd-master]# make && make install
# 配置转发端口及ip
[root@master rinetd-master]# vim /usr/local/etc/rinetd.conf
0.0.0.0 8000 10.96.242.162 8000
# 启动服务
[root@master rinetd-master]# rinetd -c /usr/local/etc/rinetd.conf
更多推荐
所有评论(0)