K8S 基础
#
什么是K8S- Kubernetes,因为首尾字母中间有8个字符,所以被简写成 K8s。
- K8s 是底层资源与容器间的一个抽象层,如果和单机架构类比,可以算 作是一个分布式时代的 Linux。
- K8s 是 Google 开源的容器集群管理系统。在 Docker 技术的基础上,为 容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列 完整功能,提高了大规模容器集群管理的便捷性。
#
K8S的特点- k8s是一个管理容器的工具,也是管理应用整个生命周期的一个工具, 从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新, 而且可以做到故障自愈。
- 可移植:支持公有云,私有云,混合云;
- 可扩展:模块化,热插拨,可组合;
- 自愈:自动替换,自动重启,自动复制,自动扩展。
#
K8S的管理步骤:- 创建集群
- 部署应用
- 发布应用
- 扩展应用
- 更新应用
#
基础架构如上图,一般分为:
- 生态系统
- 接口层
- 管理层
- 应用层
- 核心层
#
关于K8S的一些概念- 主机(Master):用于控制 Kubernetes 节点的计算机。所有任务分配都来自于此。
- 节点(Node):执行请求和分配任务的计算机。由 Kubernetes 主机负责对节点进行控制。
- 容器集(Pod):部署在单个节点上的,且包含一个或多个容器的容器组。同一容器集中的所有容器共 享同一个 IP 地址、IPC、主机名称及其它资源。容器集会将网络和存储从底层容器中抽象出来。这样, 您就能更加轻松地在集群中移动容器。
- 复制控制器(Replication controller): 用于控制应在集群某处运行的完全相同的容器集副本数量。
- 服务(Service):服务可将工作定义与容器集分离。Kubernetes 服务代理会自动将服务请求分配到正 确的容器集——无论这个容器集会移到集群中的哪个位置,即使它已被替换。
- Kubelet: 这是一个在节点上运行的服务,可读取容器清单,确保指定的容器启动并运行。
- kubectl: Kubernetes 的命令行配置工具。
#
一张图#
安装K8S(在Linux下安装单机版的集群环境:)以root身份执行以下操作:(详细步骤见第二部分)
关闭防火墙
# 关闭防火墙systemctl stop firewalld# 禁用防火墙systemctl disable firewalld
安装Kubernetes和依赖组件etcd
yum install -y etcd kubernetes
修改配置:
# Docker配置文件/etc/sysconfig/docker, 添加OPTIONS=‘-- selinux-enabled=false --insecure-registry gcr.io'# Kubernetes apiservce配置文件/etc/kubernetes/apiserver# 把--admission-control参数中的ServiceAccount删除
启动服务
# 按照顺序启动:systemctl start etcdsystemctl start dockersystemctl start kube-apiserver systemctl start kube-controller-manager systemctl start kube-scheduler systemctl start kubeletsystemctl start kube-proxy
#
K8S的相关资源2、Chart 应用仓库 https://hub.kubeapps.com/
3、中文手册 https://www.kubernetes.org.cn/docs
#
CentOS7(mini) 安装 Kubernetes 集群(kubeadm⽅式)#
准备工作安装net-tools
yum install -y net-tools
关闭firewalld
systemctl stop firewalld && systemctl disable firewalldsetenforce 0sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'
#
安装docker如今Docker分为了了Docker-CE和Docker-EE两个版本,CE为社区版即免费版,EE为企业版即商业版。我们选择使⽤用CE版。
安装yum源⼯工具包
yum install -y yum-util sdevice-mapper-persistent-data lvm2
下载docker-ce官⽅方的yum源配置⽂文件
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
禁⽤用docker-c-edge源配edge是不不开发版,不不稳定,下载stable版
yum-config-manager --disable docker-ce-edge
更新本地YUM源缓存
yum makecache fast
安装Docker-ce相应版本的
yum -y install docker-ce
测试docker,运行个hello world
systemctl start dockerdocker run hello-world
#
安装kubelet与kubeadm包使⽤用kubeadm init命令初始化集群之下载Docker镜像到所有主机的实始化时会下载kubeadm必要 的依赖镜像,同时安装etcd,kube-dns,kube-proxy,由于我们GFW防⽕火墙问题我们不不能直接访问, 因此先通过其它⽅方法下载下⾯面列列表中的镜像,然后导⼊入到系统中,再使⽤用kubeadm init来初始化 集群。
使⽤用DaoCloud加速器器(可以跳过这⼀步)
[root@localhost ~]# curl -sSLhttps://get.daocloud.io/daotools/set_mirror.sh | sh -shttp://0d236e3f.m.daocloud.iodocker version >= 1.12{"registry-mirrors": ["http://0d236e3f.m.daocloud.io"]}Success.You need to restart docker to take effect: sudo systemctl restart docker[root@localhost ~]# systemctl restart docker
下载镜像:通过Dockerfile到dockerhub⽣生成对镜像
images=(kube-controller-manager-amd64 etcd-amd64 k8s-dns-sidecar-amd64kube-proxy-amd64 kube-apiserver-amd64 kube-scheduler-amd64 pause-amd64 k8s-dns-dnsmasq-nanny-amd64 k8s-dns-kube-dns-amd64)for imageName in ${images[@]} ; do docker pull champly/$imageName docker tag champly/$imageName gcr.io/google_containers/$imageName docker rmi champly/$imageNamedone
修改版本:
docker tag gcr.io/google_containers/etcd-amd64gcr.io/google_containers/etcd-amd64:3.0.17 && \docker rmi gcr.io/google_containers/etcd-amd64 && \docker tag gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.5 && \docker rmi gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64 && \docker tag gcr.io/google_containers/k8s-dns-kube-dns-amd64gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.5 && \docker rmi gcr.io/google_containers/k8s-dns-kube-dns-amd64 && \docker tag gcr.io/google_containers/k8s-dns-sidecar-amd64gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.2 && \docker rmi gcr.io/google_containers/k8s-dns-sidecar-amd64 && \docker tag gcr.io/google_containers/kube-apiserver-amd64gcr.io/google_containers/kube-apiserver-amd64:v1.7.5 && \docker rmi gcr.io/google_containers/kube-apiserver-amd64 && \docker tag gcr.io/google_containers/kube-controller-manager-amd64gcr.io/google_containers/kube-controller-manager-amd64:v1.7.5 && \docker rmi gcr.io/google_containers/kube-controller-manager-amd64 && \docker tag gcr.io/google_containers/kube-proxy-amd64gcr.io/google_containers/kube-proxy-amd64:v1.6.0 && \docker rmi gcr.io/google_containers/kube-proxy-amd64 && \docker tag gcr.io/google_containers/kube-scheduler-amd64gcr.io/google_containers/kube-scheduler-amd64:v1.7.5 && \docker rmi gcr.io/google_containers/kube-scheduler-amd64 && \docker tag gcr.io/google_containers/pause-amd64gcr.io/google_containers/pause-amd64:3.0 && \docker rmi gcr.io/google_containers/pause-amd64
添加阿⾥里里源
[root@localhost ~]# cat >> /etc/yum.repos.d/kubernetes.repo << EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0EOF
查看kubectl kubelet kubeadm kubernetes-cni列列表
yum list kubectl kubelet kubeadm kubernetes-cni
安装kubectl kubelet kubeadm kubernetes-cni
yum install -y kubectl kubelet kubeadm kubernetes-cni
修改cgroups
vi/etc/systemd/system/kubelet.service.d/10-kubeadm.conf ##update KUBELET_CGROUP_ARGS=--cgroup-driver=systemd to KUBELET_CGROUP_ARGS=-- cgroup-driver=cgroupfs
修改kubelet中的cAdvisor监控的端⼝口,默认为0改为4194,这样就可以通过浏器器 查看kubelet的监控cAdvisor的web⻚
vi /etc/systemd/system/kubelet.service.d/10- kubeadm.conf ## Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=4194"
启动所有主机上的kubelet服务
systemctl enable kubelet && systemctl start kubelet
初始化master master节点上操作
[root@master ~]# kubeadm reset && kubeadm init --apiserver-advertise-address=192.168.0.100 --kubernetes-version=v1.7.5 --pod-network-cidr=10.200.0.0/16[preflight] Running pre-flight checks[reset] Stopping the kubelet service[reset] Unmounting mounted directories in "/var/lib/kubelet"[reset] Removing kubernetes-managed containers[reset] Deleting contents of stateful directories: [/var/lib/kubelet/etc/cni/net.d /var/lib/dockershim /var/lib/etcd][reset] Deleting contents of config directories:[/etc/kubernetes/manifests /etc/kubernetes/pki][reset] Deleting files: [/etc/kubernetes/admin.conf/etc/kubernetes/kubelet.conf /etc/kubernetes/controller-manager.conf/etc/kubernetes/scheduler.conf][kubeadm] WARNING: kubeadm is in beta, please do not use it for productionclusters.[init] Using Kubernetes version: v1.7.5[init] Using Authorization modes: [Node RBAC][preflight] Running pre-flight checks[preflight] WARNING: docker version is greater than the most recentlyvalidated version. Docker version: 17.09.0-ce. Max validated version: 1.12[preflight] Starting the kubelet service[kubeadm] WARNING: starting in 1.8, tokens expire after 24 hours bydefault (if you require a non-expiring token use --token-ttl 0)[certificates] Generated CA certificate and key.[certificates] Generated API server certificate and key.[certificates] API Server serving cert is signed for DNS names [masterkubernetes kubernetes.default kubernetes.default.svckubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.0.100][certificates] Generated API server kubelet client certificate and key.[certificates] Generated service account token signing key and public key.[certificates] Generated front-proxy CA certificate and key.[certificates] Generated front-proxy client certificate and key.[certificates] Valid certificates and keys now exist in"/etc/kubernetes/pki"[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"[kubeconfig]WroteKubeConfigfiletodisk:"/etc/kubernetes/controller- manager.conf"[kubeconfig]WroteKubeConfigfiletodisk: "/etc/kubernetes/scheduler.conf"[apiclient]CreatedAPIclient,waitingforthecontrolplanetobecome ready[apiclient]Allcontrolplanecomponentsarehealthyafter34.002949 seconds[token]Usingtoken:0696ed.7cd261f787453bd9[apiconfig]CreatedRBACrules[addons]Appliedessentialaddon:kube-proxy[addons]Appliedessentialaddon:kube-dns YourKubernetesmasterhasinitializedsuccessfully! Tostartusingyourcluster,youneedtorun(asaregularuser): 38mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config Youshouldnowdeployapodnetworktothecluster.Run"kubectlapply-f[podnetwork].yaml"withoneoftheoptionslistedat:http://kubernetes.io/docs/admin/addons/Youcannowjoinanynumberofmachinesbyrunningthefollowingoneachnodeasroot:kubeadm join --token 0696ed.7cd261f787453bd9 192.168.0.100:6443 ##这个⼀一定要记住,以后 ⽆无法重现,添加节点需要
添加节点
kubeadm join --token 0696ed.7cd261f787453bd9 192.168.0.100:6443
在master配置kubectl的kubeconfig⽂文件
[root@master ~]# mkdir -p $HOME/.kube[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
在Master上安装flannel
docker pull quay.io/coreos/flannel:v0.8.0-amd64kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.8.0/Documentation/kube-flannel.ymlkubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.8.0/Documentation/kube-flannel-rbac.yml
查看集群
kubectl get cs