我是靠谱客的博主 畅快飞鸟,最近开发中收集的这篇文章主要介绍K8s总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

K8s

文章目录

      • K8s
          • 概念:
            • 什么是k8s:
          • k8s的功能
          • k8s集群分为两类节点
            • master节点的组件(程序)
            • worker节点主键
        • Kubernets核心概念
          • Pod
          • Controllers
          • Service
          • Label
          • Namespace
      • 搭建一个完整的Kubernetes集群
          • 1、生产环境K8S平台规划
            • 架构类别
            • 生成环境k8s规划
          • 2、服务器硬件配置推荐
          • 3、官方提供三种部署方式
            • minikube
            • kubeadm
            • 二进制
          • 4、为Etcd和APISever自签SSL证书
          • SSL证书和相关概念
            • 一个完整的PKI包括以下几个部分
            • **ssl证书来源**
          • 5、Etcd数据库集群部署
          • 6、 部署Master组件
          • 7、 部署Node组件
          • 8、 部署K8S集群网络
          • 9、部署Web UI (Dashboard)
          • 10、部署集群内部DNS解析服务(CoreDNS)
            • 部署单master集群
            • 一、集群规划
            • 二、初始化服务器
            • 三、给etcd颁发证书
            • 四、部署etcd
            • 五、为api server签发证书
            • 六、部署master服务
            • 七、部署Node组件
            • 八、启动nginx容器
            • 九、配置web界面
            • 十、woker安装dns组件
            • 十一、远程管理k8s
            • k8s使用入门
            • 案例:将一个JAVA项目迁移到k8s
            • 实现k8s的高可用

概念:
什么是k8s:

​ k8s是一组服务器集群

​ k8s所管理的是集群节点上的容器

k8s的功能

​ 自我修复:容器宕机会自动重启
​ 弹性伸缩:实时根据服务器的并发情况,增加或缩减容器的数量
​ 自动部署和回滚
​ 服务发现和负载均衡
​ 机密和配置共享管理
​ 存储编排
​ 批处理

k8s集群分为两类节点

​ master node :主
​ woker node:工作

master节点的组件(程序)
名称功能
kube-apiserverKubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
schduler根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上也可以部署在不同的节点上。
kube-controller-manager处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
etcd分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
worker节点主键
名称功能
kubeletkubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
kuber-proxy在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
docker或rocket容器引擎,运行容器。

Kubernets核心概念

Pod

​ 最小部署单元
​ 一组容器的集合
​ 一个Pod中的容器共享网络命名空间
​ Pod是短暂的

Controllers

​ ReplicaSet :确保预期的Pod副本数量
​ Deployment :无状态应用部署
​ StatefulSet :有状态应用部署
​ DaemonSet :确保所有Node运行同一个Pod
​ Job :一次性任务
​ Cronjob :定时任务

Service

​ 防止Pod失联
​ 定义一组Pod的访问策略

Label

​ 标签,附加到某个资源上,用于关联对象、查询和筛选

Namespace

​ 命名空间,将对象逻辑上隔离

搭建一个完整的Kubernetes集群

1、生产环境K8S平台规划
架构类别

​ 单master
​ 多master - 生成环境

生成环境k8s规划

​ master建议3台
​ etcd至少3台(3、5、7)选择基数是为了etcd自动能够投票选出主etcd
​ worker越多越好

2、服务器硬件配置推荐
实验环境k8s master/node2Cpu 2G
测试环境k8s-mastercpu2核
内存4G
硬盘20G
k8s-nodecpu4核
内存8G
硬盘20G
生产环境k8s-mastercpu8核
内存16G
硬盘100G
k8s-nodecpu16核
内存64G
硬盘500G
3、官方提供三种部署方式
minikube

​ Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,
​ 仅用于尝试Kubernetes·部署地址: https://kubernetes.io/docs/setup/minikube/

kubeadm

​ Kubeadm也是工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。
​ 部署地址: https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

二进制

​ 推荐,从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
​ 下载地址: https://github.com/kubernetes/kubernetes/releases

4、为Etcd和APISever自签SSL证书

加解密

​ 对称加密:加密解密使用相同的密钥

​ 非对称加密:加密解密使用密钥对(公钥私钥)公钥加密、私钥解密

​ 单项加密:智能加密不能解密MD5 md5sum md5sum -c能够查看文件校验值是否相同

SSL证书和相关概念

​ PKI (Public Key Infrastructure公钥基础设)

一个完整的PKI包括以下几个部分

​ 1、端实体(申请者)
​ 2、注册结构(RC)
​ 3、签证机构(CA)
​ 4、证书撤销列表(CRL)
​ 5、证书存取库
证书内容:
​ 数字证书版本号
​ 证序列号证书签名算法证书颁发者
​ 证书有效期
​ 对象名称
​ 对象的公开密钥
​ (其他扩展信息)
​ 数字签名

ssl证书来源

​ 网络第三方机构购买,通常这种证书是用于让外部用户访问使用
​ 自己给自己发证书-自签证书

自建CA
​ openssl
​ cfssl

5、Etcd数据库集群部署

​ 二进制包下载地址

​ https://github.com/etcd-io/etcd/releases

​ 查看集群状态

​ /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key- file=/opt/etcd/ssl/server-key.pem --endpoints=“https://192.168.31.63:2379,https://192.168.31.64:2379,https://192.168.31.65:2379” cluster-health

6、 部署Master组件

​ 部署Master组件
​ 1.kube-apiserver
​ 2.kube-controller-manager
​ 3.kube-scheduler
​ 配置文件-> systemd管理组件->启动

7、 部署Node组件

​ 1.docker
​ 2. kubelet
​ 3. kube-proxy
​ 配置文件-> systemd管理组件->启动

8、 部署K8S集群网络
9、部署Web UI (Dashboard)
10、部署集群内部DNS解析服务(CoreDNS)
部署单master集群
一、集群规划

​ master1
​ 主机名:k8s-master1
​ IP:192.168.31.63
​ worker1
​ 主机名:k8s-node1
​ IP:192.168.31.65
​ worker2
​ 主机名:k8s-node2
​ IP:192.168.31.66

​ k8s版本:1.16
​ 安装方式:二进制
​ 操作系统版本:CentOs7.7

二、初始化服务器
		修改ip
​		# vim /etc/sysconfig/network-scripts/ifcfg-ens33# service network restart

​		1 关闭防火墙
​			【所有节点都要执行】
​			systemctl stop firewalld
​			systemctl disable firewalld
​		2 关闭selinux
​			【所有节点都要执行】
​			#setenforce 0
​			vim /etc/selinux/config
​			修改SETLINUX=enforcing为SETLINUX=disabled
​		3 配置主机名
​			【所有节点都要执行】
​			hostnamectl set-hostname k8s-master1
​			hostnamectl set-hostname k8s-node1
​			hostnamectl set-hostname k8s-node2
​		4 配置名称解析
​			【所有节点都要执行】
​			#vim /etc/hosts
​			所有节点添加如下四行
​				192.168.31.63			k8s-master1
​				192.168.31.64			k8s-master2
​				192.168.31.65			k8s-node1
​				192.168.31.66			k8s-node2
​		5 配置时间同步
​			选择一个节点作为服务端,剩下的作为客户端
​			master1为时间服务暑器的服务端
​			其他的为时间服务器的客户端
​			1) 配置k8s-master
​				#yum install chrony -y#vim /etc/chrony.conf#修改三项
​				server 127.0.0.1 iburst
​				allow 192.168.31.0/24
​				local stratum 10
​				#启动chrony#systemctl start chronyd#systemctl enable chronyd#ss  -unl | grep 123
​			3)配置k8s-node1和k8s-node2
​				#yum install chrony -y#vim /etc/chrony.conf#修改三项
​				server  192.168.31.63  iburst
​				#启动chrony#systemctl start chronyd#systemctl enable chronyd
​		6 关闭交换分区
​			swapoff -a
​			vim /etc/fstab #删除最后一行/dev/mapper/centos-swap swap
​			检查是否关闭成功
​			free -m
三、给etcd颁发证书

​ 流程简介
​ 1) 创建证书颁发机构
​ 2) 填写表单–写明etcd所在节点的IP
​ 3) 向证书颁发机构申请证书

		第一步︰上传TLS安装包
​				传到/root下
​		第二步︰
​				#tar xvf /root/TLS.tar.gz#cd /root/TLS#./cfssl.sh#cd etcd#vim server-csr.json
​						修改host中的IP地址,这里的IP是etcd所在节点的IP地址
​						{"CN" : "etcd",
​						"hosts": ["192.168.31.63",
​								"192.168.31.65",
​								"192.168.31.66"],"key" : {"algo" :"rsa",
​								"size": 2048
​						},
​						"names" :[{"c":"CN",
​									"L":“BeiJing",
​									"ST":“BeiJing"}]}# ./generate_etcd_cert.sh # ls *pem
​				ca-key. pem ca.pem server-key. pem server.pem
四、部署etcd

​ etcd需要三台虚拟机
​ 在master、node1、node2上分别安装一个etcd

注意∶
	解压之后会生成一个文件和一个目录
    #tar xvf etcd.tar.gz
	#mv etcd.service /usr/lib/systemd/system
	#mv etcd  /opt/
	#vim /opt/etcd/cfg/etcd.conf
		#[Member]
        ETCD_NAME="etcd-1"
        ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
        ETCD_LISTEN_PEER_URLS="https://192.168.31.63:2380"
        ETCD_LISTEN_CLIENT_URLS="https://192.168.31.63:2379"

        #[Clustering]
        ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.63:2380"
        ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.63:2379"
        ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.63:2380,etcd-					2=https://192.168.31.65:2380,etcd-3=https://192.168.31.66:2380"
        ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
        ETCD_INITIAL_CLUSTER_STATE="new"
	# rm -rf /opt/etcd/ssl/*
	# cd /root/TLS/etcd/
	# cp -fv ca.pem server.pem server-key.pem /opt/etcd/ssl/
	
	将etc管理程序和程序目录发送到node1 和node2
	# scp /usr/lib/systemd/system/etcd.service root@k8s-node1:/usr/lib/systemd/system/
	# scp /usr/lib/systemd/system/etcd.service root@k8s-node2:/usr/lib/systemd/system/
	# scp -r /opt/etcd/ root@k8s-node1:/opt/
	# scp -r /opt/etcd/ root@k8s-node2:/opt/
	
	在node1上修改etcd的配置文件
	#vim /opt/etcd/cfg/etcd.conf
	ETCD_NAME="etcd-2"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.31.65:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.31.65:2379"

    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.65:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.65:2379"
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.63:2380,etcd-2=https://192.168.31.65:2380,etcd-3=https://192.168.31.66:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
	在node2上修改etcd的配置文件
	#vim /opt/etcd/cfg/etcd.conf
	ETCD_NAME="etcd-3"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.31.66:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.31.66:2379"

    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.66:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.66:2379"
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.63:2380,etcd-2=https://192.168.31.65:2380,etcd-3=https://192.168.31.66:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"

	在三个节点一次后动etcd服务
	#systemctl start etcd
	#systemctl enable etcd
	检查是否后动成功
# /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.31.63:2379,https://192.168.31.64:2379,https://192.168.31.65:2379" cluster-health
member 72130f86e474b7bb is healthy: got healthy result from https://192.168.31.66:2379
member b46624837acedac9 is healthy: got healthy result from https://192.168.31.63:2379
member fd9073b56d4868cb is healthy: got healthy result from https://192.168.31.65:2379
cluster is healthy

​ centos7
​ systemd服务管理脚本在哪个目录?/usr/lib/systemd/system
​ centos6
​ sysV风格服务管理脚本在哪?/etc/rc.d/rcN.d
​ N代表管理级别0 1 2 3 4 5 6

五、为api server签发证书
#cd /root/TLS/k8s/
#./generate_k8s_cert.sh
六、部署master服务
# cd /root/
#tar xvf k8s-master.tar.gz
#mv kube-apiserver.service kube-controller-manager.service kube-scheduler.service /usr/lib/systemd/system/
#mv kubernetes /opt/
#cp /root/TLS/k8s/{ca*pem,server.pem,server-key.pem} /opt/kubernetes/ssl/ -rvf

​ 修改apiserver的配置文件

#vim /opt/kubernetes/cfg/kube-apiserver.conf 

KUBE_APISERVER_OPTS="--logtostderr=false 
--v=2 
--log-dir=/opt/kubernetes/logs 
#这里修改一行修改为各etcd的ip地址
--etcd-servers=https://192.168.31.63:2379,https://192.168.31.65:2379,https://192.168.31.66:2379 
#这里修改一行修改为master的ip地址
--bind-address=192.168.31.63 
--secure-port=6443 
#这里修改一行修改为master的ip地址
--advertise-address=192.168.31.63 
--allow-privileged=true 
--service-cluster-ip-range=10.0.0.0/24 
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction 
--authorization-mode=RBAC,Node 
--enable-bootstrap-token-auth=true 
--token-auth-file=/opt/kubernetes/cfg/token.csv 
--service-node-port-range=30000-32767 
--kubelet-client-certificate=/opt/kubernetes/ssl/server.pem 
--kubelet-client-key=/opt/kubernetes/ssl/server-key.pem 
--tls-cert-file=/opt/kubernetes/ssl/server.pem  
--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem 
--client-ca-file=/opt/kubernetes/ssl/ca.pem 
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem 
--etcd-cafile=/opt/etcd/ssl/ca.pem 
--etcd-certfile=/opt/etcd/ssl/server.pem 
--etcd-keyfile=/opt/etcd/ssl/server-key.pem 
--audit-log-maxage=30 
--audit-log-maxbackup=3 
--audit-log-maxsize=100 
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
	启动master
# systemctl start kube-apiserver
# systemctl enable kube-apiserver
# systemctl start kube-scheduler
# systemctl enable kube-scheduler
# systemctl start kube-controller-manager
# systemctl enable kube-controller-manager
# ps aux | grep kub
# ps aux | grep kub | wc -l
#cp /opt/kubernetes/bin/kubectl /bin/
# kubectl get cs
# cat /var/log/messages|grep kube-apiserver|grep Error

配置tls基于bootstrap自动颁发证书
#kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

七、部署Node组件
#安装worker node节点
	#docker:启动容器
	#kubelet:接受apiserver的指令,然后控制docker容器
	#kube-proxy:为worker上的容器配置网络工作
	第一步:安装配置docker
        # tar xvf k8s-node.tar.gz 
        # mv docker.service /usr/lib/systemd/system
        # mkdir /etc/docker
        # cp daemon.json /etc/docker/
        # tar xf docker-18.09.6.tgz 
        # mv docker/* /bin/
        # systemctl start docker
        # systemctl enable docker
        # docker info
        出现警告
        WARNING: bridge-nf-call-iptables is disabled
        WARNING: bridge-nf-call-ip6tables is disabled

        #vi /etc/sysctl.conf
        添加下面两行
        net.bridge.bridge-nf-call-ip6tables = 1
		net.bridge.bridge-nf-call-iptables = 1
		
		#sysctl -p
		
    第二步:安装kubelet和kube-proxy
		1)生成程序目录和管理脚本
		# mv kubelet.service kube-proxy.service /usr/lib/systemd/system/
		# mv kubernetes /opt/
		
		2)修改配置文件(4个)
		#vim /opt/kubernetes/cfg/kube-proxy.kubeconfig
            apiVersion: v1
            clusters:
            - cluster:
                certificate-authority: /opt/kubernetes/ssl/ca.pem
                #这里修改一行修改为master的ip地址
                server: https://192.168.31.63:6443         
              name: kubernetes
            contexts:
            - context:
                cluster: kubernetes
                user: kube-proxy
              name: default
            current-context: default
            kind: Config
            preferences: {}
            users:
            - name: kube-proxy
              user:
                client-certificate: /opt/kubernetes/ssl/kube-proxy.pem
                client-key: /opt/kubernetes/ssl/kube-proxy-key.pem
                
          #vim /opt/kubernetes/cfg/kube-proxy-config.yml
          	kind: KubeProxyConfiguration
            apiVersion: kubeproxy.config.k8s.io/v1alpha1
            address: 0.0.0.0
            metricsBindAddress: 0.0.0.0:10249
            clientConnection:
              kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig
            #这里修改一行修改为当前node主机名
            hostnameOverride: k8s-node1
            clusterCIDR: 10.0.0.0/24
            mode: ipvs
            ipvs:
              scheduler: "rr"
            iptables:
              masqueradeAll: true
              
            #vim /opt/kubernetes/cfg/kubelet.conf 
              KUBELET_OPTS="--logtostderr=false 
            --v=2 
            --log-dir=/opt/kubernetes/logs 
             #这里修改一行修改为当前node主机名
            --hostname-override=k8s-node1 
            --network-plugin=cni 
            --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig 
            --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig 
            --config=/opt/kubernetes/cfg/kubelet-config.yml 
            --cert-dir=/opt/kubernetes/ssl 
            --pod-infra-container-image=lizhenliang/pause-amd64:3.0"
		
			#vim /opt/kubernetes/cfg/bootstrap.kubeconfig
			apiVersion: v1
            clusters:
            - cluster:
            certificate-authority: /opt/kubernetes/ssl/ca.pem
            #这里修改一行修改为master的ip地址
            server: https://192.168.31.63:6443
            name: kubernetes
            contexts:
            - context:
            cluster: kubernetes
            user: kubelet-bootstrap
            name: default
            current-context: default
            kind: Config
            preferences: {}
            users:
            - name: kubelet-bootstrap
            user:
            token: c47ffb939f5ca36231d9e3121a252940
		3)从master节点复制证书到worker节点
			#scp /root/TLS/k8s/{ca.pem,kube-proxy-key.pem,kube-proxy.pem} root@k8s-node1:/opt/kubernetes/ssl/
			
		4)启动kubelet和kube-proxy服务
           	# systemctl start kubelet
            # systemctl start kube-proxy
            # systemctl enable kubelet
            # systemctl enable kube-proxy
            #tail -f /opt/kubernetes/logs/kubelet.INFO
            如果看到最好一行信息是如下内容,就表示启动服务正常
            I1127 04:02:12.739317   12044 bootstrap.go:150] No valid private key and/or certificate found, reusing existing private key or creating a new one
		5)在master节点为worker节点颁发证书
			# kubectl get csr
			#注意名称使用worker名称
			# kubectl certificate approve node-csr-CrnUKpLuLNVktpxCJDjlGQGo3IYAJq2kOV_YNVm0s18
		6)给Worker节点颁发证书之后,就可以在master上看到worker节点了
			#kubectl get nodes
			
			
		先修改node1和node2的docker配置文件
		#vim /etc/ docker/daemon.json
		{
            "registry-mirrors": [
            "https://docker.mirrors.ustc.edu.cn",	
            "http://bc437cce.m.daocloud.io"
            ],
            "insecure-registries": ["192.168.31.70"]
    }
    #systemctl daemon-reload
	#systemctl restart docker
		
	第三步:安装网络插件
		1)确认启用CNI
			# grep "cni" /opt/kubernetes/cfg/kubelet.conf 
		2)安装CNI
			# mkdir -pv /opt/cni/bin /etc/cni/net.d
			# tar xf cni-plugins-linux-amd64-v0.8.2.tgz -C /opt/cni/bin
		3)在master执行yaml脚本,实现在worker节点安装启动网络插件功能
			# cd /root/YAML/
			# kubectl delete -f kube-flannel.yaml
			# kubectl apply -f kube-flannel.yaml
			注意:
				kubectl apply 操作受限于网络,可能会需要5~10分钟才能执行成功如果网上太慢,会导致超时
			# kubectl get pods -n kube-system
			# kubectl get nodes
	第四步:授权apiserver可以访问kubelet
			# kubectl apply -f apiserver-to-kubelet-rbac.yaml
	查看节点描述信息
	# kubectl describe node k8s-node1

八、启动nginx容器

​ 1)修改node1和node2的docker配置文件

​ #vim /etc/ docker/daemon.json

{
    "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",	
    "http://bc437cce.m.daocloud.io"
    ],
    "insecure-registries": ["192.168.31.70"]
}

2)重启服务
#systemctl daemon-reload
#systemctl restart docker

3)在master上启动nginx

创建deployment,通过deployment来创建和管理nginx容器
	# kubectl create deployment myweb --image=nginx:1.8
查看一下deployment的状态
	# kubectl get deployment
查看pods的状态
	# kubectl get pods
	# kubectl describe pod myweb-5b79bf86d4-r9cdf


  1. 暴露myweb的端口到物理机

# kubectl expose deployment myweb --port=80 --type=NodePort
# kubectl get svc

  1. 访问集群任意节点的20828来访问nginx
# curl http://192.168.31.65:20828/
九、配置web界面

​ 官方: kubernetes dashboard

# kubectl apply -f /root/YAML/dashboard.yaml
# kubectl get pods -n kubernetes-dashboard
# kubectl get svc -n kubernetes-dashboard

​ 第三方: kuboard

worker节点
	#docker load -i kuboard-1.tar.gz
master节点
    修改一行,指定希望kuboard运行在哪个节点:
    # vim start_kuboard.yaml
        nodeName: master修改为	nodeName: k8s-node1
    # kubectl apply -f start_kuboard.yaml
 	# kubectl get pods -n kube-system
 	查看一下kuboard的暴辉的端口
	# kubectl get svc -n kube-system
生成tocken
	#kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d

十、woker安装dns组件
k8s中用来实现名称解析的是:CoreDNS
# cd /root/YAML/
# kubectl apply -f coredns.yaml 
# kubectl get pods -n kube-system | grep 
十一、远程管理k8s
默认情况下,k8s仅仅可以在master节点进行管理操作
1)将管理工具复制到worker节点【master执行】
	[root@k8s-master1 ~]# scp /bin/kubectl root@k8s-node2:/bin

2)生成管理员证书【master执行】
    [root@k8s-master1 ~]# cd /root/TLS/k8s/
    [root@k8s-master1 k8s]# vim admin-csr.json

    写入如下内容:
        {
          "CN": "admin",
          "hosts": [],
          "key": {
            "algo": "rsa",
            "size": 2048
          },
          "names": [
            {
              "C": "CN",
              "L": "BeiJing",
              "ST": "BeiJing",
              "O": "system:masters",
              "OU": "System"
            }
          ]
        }

    颁发admin证书
    [root@k8s-master1 k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin

3)创建kubeconfig文件【master执行】
    设置集群参数
        [root@k8s-master1 k8s]# kubectl config set-cluster kubernetes 
       --server=https://192.168.31.63:6443 
       --certificate-authority=ca.pem 
       --embed-certs=true 
       --kubeconfig=config

    设置客户端认证参数
        [root@k8s-master1 k8s]# kubectl config set-credentials cluster-admin 
        --certificate-authority=ca.pem 
        --embed-certs=true 
        --client-key=admin-key.pem 
        --client-certificate=admin.pem 
        --kubeconfig=config

    设置上下文参数
        [root@k8s-master1 k8s]# kubectl config set-context default 
           --cluster=kubernetes 
           --user=cluster-admin 
           --kubeconfig=config
	设置默认上下文
        [root@k8s-master1 k8s]# kubectl config use-context default --kubeconfig=config

 4)将生产的config文件发送到worker节点【master执行】
    	[root@k8s-master1 k8s]# scp config root@k8s-node2:/root/

 5)在worker节点,基于config实现执行kubectl命令【worker执行】
	[root@k8s-node2 ~]# kubectl get nodes --kubeconfig=/root/config
	
	NAME        STATUS   ROLES    AGE    VERSION
	k8s-node1   Ready    <none>   2d4h   v1.16.0
	k8s-node2   Ready    <none>   47h    v1.16.0
	
	[root@k8s-node2 ~]# mkdir ~/.kube
	[root@k8s-node2 ~]# mv /root/config /root/.kube/
	[root@k8s-node2 ~]# kubectl get nodes
	NAME        STATUS   ROLES    AGE    VERSION
	k8s-node1   Ready    <none>   2d4h   v1.16.0
	k8s-node2   Ready    <none>   47h    v1.16.0
k8s使用入门

​ 案例:管理和使用deployment

deployment
	创建指定数量的pod
	检查pod健康状态和数量

1)基于deployment创建nginx pod,有一个副本
	方法1:
		[root@k8s-master1 k8s]# kubectl run nginx-dep1 --image=nginx:1.8 --replicas=1
	方法2:
		通过kuboard创建pod,http://k8s-node1:32567/
		1.名称(应用)空间选择default
		2.创建工作负载
	方法3:
		首先创建yaml文件ngx_dep.yaml
		#cd /root/
		#vim ngx-dep.yaml
		写入以下内容
		apiVersion: apps/v1
        kind: Deployment
        metadata:
            name: ngx-dep3
            labels:
                app: nginx
                type: webservice
        spec:
            replicas: 1
            selector: 
                matchLabels:
                     app: ngx
            template:
                 metadata:
                   labels:
                      app: ngx
                 spec:
                  containers:
                    - name: nginx
                      image: nginx:1.8

		然后执行yaml文件
			# kubectl apply -f ngx-dep.yaml 

2)查看k8s对象状态
	# kubectl get 资源类型
	# kubectl describe 资源类型
	# kubectl logs 显示pod中的容器中运行过程中产生的日志信息
	# kubectl exec -it pod对象 /bin/sh
	资源类型:
				node
				pod
				service
				deployment
				ns
				....
			选项:
			-n namesapce
			-A
	
    例子:显示所有名称空间中的pod
    # kubectl get pod -A -o wide
    
3)发布应用
     用service来发布服务
		
     首先创建yaml
     # vim ngx_svc.yaml
			apiVersion: v1
            kind: Service
            metadata:
                name: ngx-svc
                labels:
                  app: ngx
            spec:
                selector:
                  app: ngx
                ports:
                  - name: nginx-ports
                    protocol: TCP
                    port: 80
                    nodePort: 32002
                    targetPort: 80
                type: NodePort
	
    执行yaml
    	# kubectl apply -f ngx_svc.yaml

    此时可以看到service的端口映射信息
   		# kubectl get svc

    此时,可以访问集群中的任意一个node节点,来访问web页面
		http://k8s-node1:32002/

 4)服务伸缩(scalling)
	根据客户端的请求流量实现弹性管理
	修改yaml中的replicas
	# vim ngx-dep.yaml 
	# kubectl apply -f ngx-dep.yaml 
 5)滚动更新
 	修改yaml中的image版本 image: nginx:1.7.9
 	# vim ngx-dep.yaml 
	# kubectl apply -f ngx-dep.yaml  

在这里插入图片描述
在这里插入图片描述

案例:将一个JAVA项目迁移到k8s
	注意:
		在k8s环境中,开发交付镜像,而不是源码
	规划
        k8s
            master:192.168.31.63
            worker:192.168.31.63  192.168.31.65   192.168.31.66
        mysql
            mariadb: 192.168.31.67
        项目:
            java
        代码:
            java代码


第一步:制作镜像
	运行环境镜像:tomcat-base-image.tar.gz
	1)在所有的node节点导入
		[root@k8s-node1 ~]# docker load -i tomcat-base-image.tar.gz 
		[root@k8s-node2 ~]# docker load -i tomcat-base-image.tar.gz 

	2)在67节点安装mysql,并导入数据库
        [root@sql ~]# yum install mariadb-server -y
        [root@sql ~]# systemctl start mariadb
        [root@sql ~]# systemctl enable mariadb

		[root@sql ~]# mysql
        MariaDB [(none)]> grant all on mydb.* to "test"@"%" identified by "123";
        Query OK, 0 rows affected (0.00 sec)

        MariaDB [(none)]> flush privileges;
        Query OK, 0 rows affected (0.00 sec)


        MariaDB [(none)]> use test;
        Database changed
        MariaDB [test]> show tables;
        Empty set (0.00 sec)

        MariaDB [test]> source /root/tables_ly_tomcat.sql
        Query OK, 1 row affected, 1 warning (0.00 sec)

        Database changed
        Query OK, 0 rows affected (0.01 sec)

        Query OK, 0 rows affected (0.00 sec)

        MariaDB [test]> show tables;
        +----------------+
        | Tables_in_test |
        +----------------+
        | user           |
        +----------------+
        1 row in set (0.00 sec)

        MariaDB [test]> select * from user;
        Empty set (0.00 sec)

        MariaDB [test]> describe user
        -> ;
        +-------+--------------+------+-----+---------+----------------+
        | Field | Type         | Null | Key | Default | Extra          |
        +-------+--------------+------+-----+---------+----------------+
        | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
        | name  | varchar(100) | NO   |     | NULL    |                |
        | age   | int(3)       | NO   |     | NULL    |                |
        | sex   | char(1)      | YES  |     | NULL    |                |
        +-------+--------------+------+-----+---------+----------------+
        4 rows in set (0.00 sec)
		
        MariaDB [test]> quit
        Bye
        如果不是test库需要授权
        MariaDB [(none)]> grant all on mydb.* to "test"@"%" identified by "123";
        MariaDB [(none)]> flush privileges;

        在master节点测试是否可以登录mysql
        # yum install mysql -y
        mysql -utest -p -h192.168.31.67

	3)在master节点使用java demo
        [root@k8s-master1 ~]# tar xvf java-demo.tar.gz 
        [root@k8s-master1 ~]# cd tomcat-java-demo-master/
        [root@k8s-master1 ~]# cd tomcat-java-demo-master/src/main/resources/
        [root@k8s-master1 resources]# vim application.yml 
	
	修改三行
        url: jdbc:mysql://192.168.31.67:3306/mydb?characterEncoding=utf-8
        username: test
        password: 123


	4)将javademo构建到docker 镜像中
        [root@k8s-master1 ~]# yum install maven java-1.8.0-openjdk -y
        [root@k8s-master1 ~]# cd tomcat-java-demo-master/
        [root@k8s-master1 ~]# mvn clean package -Dmaven.test-skip=true

	5)使用dockerfile构建镜像
        [root@k8s-master1 ~]# cd tomcat-java-demo-master/
        [root@k8s-master1 tomcat-java-demo-master]# docker build -t javapro .
        [root@k8s-master1 tomcat-java-demo-master]# docker image ls
	
	
	6)保存javapro到本地
	[root@k8s-master1 ~]# docker save javapro>./javapro.tar.gz
	
	7)从master拷贝到node, 

	[root@k8s-master1 ~]# scp javapro.tar.gz root@k8s-node1:/root/
	[root@k8s-master1 ~]# scp javapro.tar.gz root@k8s-node2:/root/
 	8)所有的node节点导入 
    [root@k8s-node1 ~]# docker load -i javapro.tar.gz
    [root@k8s-node2 ~]# docker load -i javapro.tar.gz 
	
	
第二步:启动pod	
	1) aml文件,然后进行修改
        修改
            修改副本数   replicas: 2
            修改镜像拉取策略   imagePullPolicy: Never
	[root@k8s-master1 ~]# kubectl create deployment javapro1 --image=javapro --dry-run -o yaml>javapro.yaml
	apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: javapro1
      name: javapro1
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: javapro1
      strategy: {}
      template:
        metadata:
          labels:
            app: javapro1
        spec:
          containers:
          - image: javapro
            imagePullPolicy: Never
            name: javapro


2)启动
[root@k8s-master1 tomcat-java-demo-master]# kubectl apply -f javapro.yaml 
 3)映射端口
[ root@k8s-master1 ~]# kubectl expose deployment javapro1 --target-port=8080 --type=NodePort --port=80 --dry-run -o yaml>javasvc.yaml
[root@k8s-master1 ~]# kubectl apply -f javasvc.yaml 
[root@k8s-master1 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
javapro1     NodePort    10.0.0.148   <none>        80:30243/TCP   3s
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP        22h
myweb        NodePort    10.0.0.196   <none>        80:30073/TCP   7h45m
ngx-svc      NodePort    10.0.0.203   <none>        80:32002/TCP   4h5m

访问任意node的30243端口
http://k8s-node1:30243/

###############################################################
devops
python
docker+k8s
git+jenkins

k8s
docker
docker 三剑客(compose,swam、machine)

pod 与 pod控制器
一个pod中是一个或者多个容器
kod控制器是用来控制、管理pod的数量、状态

service
由于pod的地址会发生改变,通过service 可以为pod提供一个统一的访问入口

############################################################

k8s集群中的lb的实现方式
自建lb:
使用运营商的lb:如果你用阿里云主机部署k8s集群,那么建议用运营商

自建lb方式
lvs
HAproxy
nginx

当前解决方案
nginx+keepalived

实现k8s的高可用

​ 添加一个master节点,解决前面配置中的master节点的单点故障问题

大概流程:
	再启动三个虚拟机
	一个作为master
	另外两个作为lb的主和备
			第一步:配置master2
			
			1)初始化服务器
                [root@k8s-master2 ~]# hostnamectl set-hostname k8s-master2 
                [root@k8s-master2 ~]# systemctl stop firewalld
                [root@k8s-master2 ~]# systemctl disable firewalld
                [root@k8s-master2 ~]# getenforce 0
                [root@k8s-master2 ~]# vim /etc/selinux/config 
                [root@k8s-master2 ~]#  
                [root@k8s-master2 ~]# swapoff -a
                [root@k8s-master2 ~]# vim /etc/fstab 
                [root@k8s-master2 ~]# vim /etc/hosts
                [root@k8s-master2 ~]# yum install chrony -y
                [root@k8s-master2 ~]# vim /etc/chrony.conf 
                [root@k8s-master2 ~]# systemctl restart chronyd
                [root@k8s-master2 ~]# systemctl enable chroynd
                [root@k8s-master2 ~]# systemctl enable chronyd
                [root@k8s-master2 ~]# 
                [root@k8s-master2 ~]# chronyc sources
			【如果不清楚初始化过程,请查看前面的笔记】
			
		安装k8s组件
        	为了简单,从master1上复制配置好的k8s组件
                [root@k8s-master1 ~]# scp -r /opt/etcd/ root@k8s-maste2:/opt/
                [root@k8s-master1 ~]# scp -r /opt/kubernetes root@k8s-master2:/opt/
                [root@k8s-master1 ~]# cd /usr/lib/systemd/system
                [root@k8s-master1 system]# scp kube-apiserver.service  kube-controller-manager.service  kube-scheduler.service root@k8s-master2:/usr/lib/systemd/system
                [root@k8s-master1 system]# scp /bin/kubectl root@k8s-master2:/bin/
                
       		在master2上修改apiserver的配置文件
            	[root@k8s-master2 ~]# vi /opt/kubernetes/cfg/kube-apiserver.conf
        	修改两行:分别制定当前节点自己监听的IP
                --bind-address=192.168.31.64 
                --advertise-address=192.168.31.64 
                
		 	启动master2的服务了
                [root@k8s-master2 ~]# systemctl daemon-reload
                [root@k8s-master2 ~]# systemctl restart kube-apiserver
                [root@k8s-master2 ~]# systemctl restart kube-controller-manager
                [root@k8s-master2 ~]# systemctl restart kube-scheduler
                [root@k8s-master2 ~]# systemctl enable kube-apiserver
                [root@k8s-master2 ~]# systemctl enable kube-controller-manager
                [root@k8s-master2 ~]# systemctl enable kube-scheduler
                
      		 检查是否启动成功
                [root@k8s-master2 ssl]# ps aux | grep kube
                [root@k8s-master2 ssl]# kubectl get nodes
                
        2)安装部署lb
            启用两个节点,分布安装nginx、keepalived

            首先进行两个节点的初始化
            略

            然后,在两个节点分布安装nginx
                [root@lb-backup ~]# rpm ivh nginx-1.16.1-1.el7.ngx.x86_64.rpm 
                [root@lb-backup ~]# vim /etc/nginx/nginx.conf 
                    stream {
                        log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
                        access_log  /var/log/nginx/k8s-access.log  main;
                        upstream k8s-apiserver {
                                    server 192.168.31.63:6443;
                                    server 192.168.31.64:6443;
                                }
                        server {
                           listen 6443;
                           proxy_pass k8s-apiserver;
                        }
                    }

                [root@lb-backup ~]# systemctl restart nginx
                [root@lb-backup ~]# systemctl enable nginx
                [root@lb-backup ~]# ss -tnl | grep 80
                LISTEN     0      128          *:80      *:*                 
        	
        	安装keepalived,实现高可用
                [root@lb-backup ~]# yum instll keepalived -y

            用给你的配置文件,替换master和backup上的配置文件
          		  略

            修改配置文件

            查看是有vip

最后

以上就是畅快飞鸟为你收集整理的K8s总结的全部内容,希望文章能够帮你解决K8s总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部