这个是一个非常简单的教程, 只是帮助对k8s有一个大概的概念

k8s 是什么?
官方解释:Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
这个问题可能很多人都有,所以我先说下我对k8s的理解:

  1. k8s可以自动部署docker容器
  2. k8s提供了容器间的负载均衡功能
  3. k8s具有弹性伸缩功能, 能根据使用情况扩展和收缩容器规模
  4. k8s还能监控各容器情况, 即时故障发现, 自动替换成新的容器【主备功能】
  5. k8s的某个node(服务器)【硬件或者网络】出问题了, 可以在其他node上创建新的容器, 保证容器数和设置的一致
    所以k8s一个对docker容器做cd(自动化交付)和自动化运维的集群系统【如果理解错误希望指正】。
其实可以理解k8s是一个简版的阿里云
  1. 通过阿里云选择配置购买ecs服务器(编写k8s脚本部署pod)
  2. 阿里云可以手动(自动)随时扩展销毁ecs服务器(即k8s弹性收缩)
  3. 多个服务器下,购买阿里云的负载均衡功能(即k8s提供负载均衡)
  4. 如果阿里云的ecs服务器出问题了, 会自动替换(即k8s的容器出问题了也会自动替换)
  5. ecs的应用出问题了, 只能自己手动修复。(k8s有一个容器修复功能)


介绍2个开源的k8s平台
6. KubeOperator

KubeOperator 是一个开源项目,在离线网络环境下,通过可视化 Web UI 在 VMware、Openstack 或者物理机上规划、部署和运营生产级别的 Kubernetes 集群。KubeOperator 是 Jumpserver 明星开源团队在 Kubernetes 领域的的又一全新力作。

  1. Rancher

Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。

  1. Kubernetes Dashboard

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


部署完成以后详细信息

在这里插入图片描述



安装问题
  1. 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

  1. 无法访问, 首先确认容器的端口是否填写正确,如果不行试试下面这个方法
# 配置端口转发
[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

  1. 删除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

  1. 不能访问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
  1. 删除 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

提供一些排错命令
  1. route -n 查看路由表
  2. tracepath -n ip 追踪路由信息
  3. ip a 显示IP地址信息
  4. kubectl get pods -o wide -A 查看pod的信息
  5. kubectl get service -A 查看service信息
  6. kubectl get deployment -A 查看部署信息
  7. kubectl delete pods pod名字 [–namespace=kube-system 指定命名空间,不指定可能提示找不到pod]
  8. 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负载均衡
  1. 配置文件共享
# 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
  1. 创建部署
[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 
  1. 创建负载均衡服务
[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
  1. 配置端口转发
#下载 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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐