centos 7 安装 kubernetes
1、参考文章
https://blog.51cto.com/3241766/2405624
(这个文章写的条理挺好的,但是其中有好几个地方会存在一些问题,在此文章最后面已经写明,可以参考一下)
https://www.cnblogs.com/Erik_Xu/p/8783789.html
2、软件版本相关概览
Centos 7.6安装参考:
https://www.cnblogs.com/zhuzi91/p/12356856.html
安装步骤包含如下部分
1、docker 安装(两个节点都要执行)
2、k8s 安装准备工作(两个节点都要执行)
3、Master 节点安装
4、Node 节点安装
5、DashBoard 安装(这个部分浏览器访问的时候一直不出来,暂时还不知道是什么原因)
6、集群测试
1、Docker 安装(两个节点都要执行)
1>、docker 安装 1)、移除旧版本的 docker yum remove docker docker-common docker-selinux docker-engine yum remove docker-ce rm -rf /var/lib/docker 2)、查看有没有安装 rpm -qa|grep device-mapper-persistent-data rpm -qa|grep lvm2 3)、安装 yum install -y yum-utils device-mapper-persistent-data lvm2 4)、配置镜像地址 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 5)、然后修改镜像地址,更改为国内的,这样可以下载快一点 vim /etc/yum.repos.d/docker-ce.repo 修改地址为清华的 %s@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce 6)、更新缓存 yum makecache fast 2>、docker ce安装 1)、安装最新版的 docker-ce yum install -y docker-ce docker-ce-cli containerd.io ##安装指定版本docer-ce 可使用以下命令查看 yum list docker-ce.x86_64 --showduplicates |sort -r ##安装完成之后可以使用命令查看 docker version 3>、配置 docker 镜像加速 vim /etc/docker/daemon.json { "registry-mirrors" : ["https://v16stybc.mirror.aliyuncs.com"] } ##通知 systemd 重载此配置文件 systemctl daemon-reload ##设置开机启动 systemctl enable docker ##启动 docker systemctl start docker
2、k8s 准备工作相关(两个节点都要执行)
k8s 相关配置 1)、设置系统主机名以及 Host 文件的相互解析 hostnamectl set-hostname k8s-master01 2)、修改 hosts 文件 vim /etc/hosts 192.168.56.2 k8s-master01 192.168.56.3 node01 3)、验证 uuid 和 mac 地址(enp0s3 根据自己的进入相应的目录,ip addr 看一下网卡的名字即可) cat /sys/class/net/enp0s3/address cat /sys/class/dmi/id/product_uuid 4)、安装依赖包 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wgetvimnet-tools git 5)、设置防火墙为 Iptables 并设置空规则 systemctl stop firewalld && systemctl disable firewalld yum -y install iptables-services && systemctl start iptables && systemctl enable iptables&& iptables -F && service iptables save 6)、关闭 SELINUX(临时禁用&&永久禁用) swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 7)、调整内核参数,对于 K8S vim kubernetes.conf net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它 vm.swappiness=0 # 不检查物理内存是否够用 vm.overcommit_memory=1 # 开启 OOM fs.inotify.max_user_instances=8192 vm.panic_on_oom=0 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 cp kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf 8)、 修改Cgroup Driver 1>、修改daemon.json [root@k8s-master01 ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"]//新增这行 } 2>、 重新加载docker [root@k8s-master01 ~]# systemctl daemon-reload && systemctl restart docker 修改cgroupdriver是为了消除告警: [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ 9)、新增 k8s 源 [root@k8s-master01 ~]#vim /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg [] 中括号中的是repository id,唯一,用来标识不同仓库 name 仓库名称,自定义 baseurl 仓库地址 enable 是否启用该仓库,默认为1表示启用 gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证 repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证 gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了 更新缓存 [root@k8s-master01 ~]# yum clean all [root@k8s-master01 ~]# yum -y makecache 10)、调整系统时区,设置系统时区为中国/上海 timedatectl set-timezone Asia/Shanghai 将当前的 UTC 时间写入硬件时钟 timedatectl set-local-rtc 0 重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond 11)、关闭系统不需要的服务 systemctl stop postfix && systemctl disable postfix 12)、设置 rsyslogd 和 systemd journald mkdir /var/log/journal 持久化保存日志的目录 mkdir /etc/systemd/journald.conf.d vim /etc/systemd/journald.conf.d/99-prophet.conf Journal] #持久化保存到磁盘 Storage=persistent # 压缩历史日志 Compress=yes SyncIntervalSec=5 mRateLimitInterval=30s RateLimitBurst=1000 # 最大占用空间 10G SystemMaxUse=10G # 单日志文件最大 200M SystemMaxFileSize=200M # 日志保存时间 2 周 MaxRetentionSec=2week # 不将日志转发到 syslogForwardToSyslog=no systemctl restart systemd-journald 13)、升级系统内核为 4.44CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定 rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次! yum --enablerepo=elrepo-kernel install -y kernel-lt 设置开机从新内核启动 grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'
3、master 节点安装
1. 版本查看 [root@k8s-master01 ~]# yum list kubelet --showduplicates | sort -r 2. 安装kubelet、kubeadm和kubectl(不指定版本,默认用的就是最新版本) yum install -y kubelet kubeadm kubectl 2.1.安装包说明 kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具 kubeadm 用于初始化集群,启动集群的命令工具 kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件 2.2.启动kubelet并设置开机启动 [root@k8s-master01 ~]# systemctl enable kubelet && systemctl start kubelet 2.3.kubelet命令补全 [root@k8s-master01 ~]## echo "source <(kubectl completion bash)" >> ~/.bash_profile [root@k8s-master01 ~]# source ~/.bash_profile 3. 下载镜像 3.1 Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。 [root@k8s-master01 ~]## vim image.sh #!/bin/bash url=gcr.azk8s.cn/google-containers version=v1.17.3 images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`) for imagename in ${images[@]} ; do docker pull $url/$imagename docker tag $url/$imagename k8s.gcr.io/$imagename docker rmi -f $url/$imagename done url为阿里云镜像仓库地址,version为安装的kubernetes版本。 3.2 下载镜像 1)、首先要给 image.sh 赋于执行权限 chmod u+x ./image.sh 2)、运行脚本image.sh,下载指定版本的镜像 ./image.sh 4.初始化 master 4.1 初始化 [root@k8s-master01 ~]# kubeadm init --apiserver-advertise-address 192.168.56.2 --pod-network-cidr=10.244.0.0/16 apiserver-advertise-address指定master的interface,pod-network-cidr指定Pod网络的范围,这里使用flannel网络方案 记录kubeadm join的输出,后面需要这个命令将各个节点加入集群中。输出大概如下的内容: To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.56.2:6443 --token f09fag.fohc5f0v9eb4ail5 \ --discovery-token-ca-cert-hash sha256:5c08d18980a8e0c251664fda92427814a02c31b152ac553b6539b5123067ce86 4.2 加载环境变量 [root@k8s-master01 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile [root@k8s-master01 ~]# source ~/.bash_profile 本文所有操作都在root用户下执行,若为非root用户,则执行如下操作: mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config 5. 安装pod网络(如果此命令执行不成功,可能是文件拉取的问题,直接把这个文件下载到本地即可) [root@k8s-master01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/ kube-flannel.yml 下载本地后执行:(直接打开网址,复制到本地文件中) [root@k8s-master01 ~]#kubectl apply -f kube-flannel.yml 6. master节点配置 taint:污点的意思。如果一个节点被打上了污点,那么pod是不允许运行在这个节点上面的 6.1 删除master节点默认污点 默认情况下集群不会在master上调度pod,如果偏想在master上调度Pod,可以执行如下操作: 查看污点: [root@k8s-master01 ~]# kubectl describe node master|grep -i taints Taints: node-role.kubernetes.io/master:NoSchedule 删除默认污点: [root@k8s-master01 ~]# kubectl taint nodes master node-role.kubernetes.io/master- node/master untainted 6.2 污点机制 语法 kubectl taint node [node] key=value[effect] 其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ] NoSchedule: 一定不能被调度 PreferNoSchedule: 尽量不要调度 NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod 打污点 [root@k8s-master01 ~]# kubectl taint node master key1=value1:NoSchedule node/master tainted [root@k8s-master01 ~]# kubectl describe node master|grep -i taints Taints: key1=value1:NoSchedule key为key1,value为value1(value可以为空),effect为NoSchedule表示一定不能被调度 删除污点: [root@k8s-master01 ~]# kubectl taint nodes master key1- node/master untainted [root@k8s-master01 ~]# kubectl describe node master|grep -i taints Taints: <none> 删除指定key所有的effect,‘-’表示移除所有以key1为键的污点
4、Node节点安装
1)、查看令牌 [root@k8s-master01 ~]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS dnpkej.113e5cokaq30qcra 18h 2020-02-25T12:12:21+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token 2)、 生成新的令牌(如果过期的话) [root@k8s-master01 ~]# kubeadm token create dnpkej.113e5cokaq30qcra 3)、 生成新的加密串 [root@k8s-master01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //' 63de5412694706097a440cb9375d5e06207dfdf225579aa04b489b6470ea46c3 4)、 node节点加入集群 在node节点上分别执行如下操作: [root@node01 tmp]# kubeadm join 192.168.56.2:6443 --token dnpkej.113e5cokaq30qcra --discovery-token-ca-cert-hash sha256:63de5412694706097a440cb9375d5e06207dfdf225579aa04b489b6470ea46c3
5、Dashboard安装
1. 下载yaml [root@k8s-master01 ~]# wget https://github.com/yeyinzhu321/Centos7.6-install-k8s-v1.14.2-cluster/blob/master/kubernetes-dashboard.yaml 2. 配置yaml 2.1 修改镜像地址 sed -i 's/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/kuberneters/g' kubernetes-dashboard.yaml 由于默认的镜像仓库网络访问不通,故改成阿里镜像 2.2 外网访问 sed -i '/targetPort:/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' kubernetes-dashboard.yaml 配置NodePort,外部通过https://NodeIp:NodePort 访问Dashboard,此时端口为30001 2.3 新增管理员帐号(在文件最后添加如下的配置) vim kubernetes-dashboard.yaml --- # ------------------- dashboard-admin ------------------- # apiVersion: v1 kind: ServiceAccount metadata: name: dashboard-admin namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: dashboard-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin 创建超级管理员的账号用于登录Dashboard 3. 部署访问 3.1 部署Dashboard [root@k8s-master01 ~]# kubectl apply -f kubernetes-dashboard.yaml 3.2 状态查看 [root@k8s-master01 ~]# kubectl get deployment kubernetes-dashboard -n kube-system [root@k8s-master01 ~]# kubectl get pods -n kube-system -o wide [root@k8s-master01 ~]# kubectl get services -n kube-system 3.3 令牌查看 kubectl describe secrets -n kube-system dashboard-admin 令牌为: eyJhbGciOiJSUzI1NiIsImtpZCI6InZDSWF3X1JBcjB6ZGFzbF9pZ0N4a0FKTEREMTFtZUJGVzlFVUJOdUNMMkEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tc21tdzkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYmE5MzExYzMtMDMyOC00ZTUzLTg0M2MtNjZhN2I4YzA4Njc3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.xi7exXIYJYr1r8epqdDqajmWK_5vIqcqvNhjEkmkkOstsH5eiFdlKvyIYNm416-98mD5CPYRWq4aSl1DmXYa1un6a37X0WV0bKaDDEj-oCCnFs5Sucol7sCs5IGMZ8xVRwQCYseLlPGJCuY0u3d-Fx3BtuiHlvuHKLIMEgNWHOIgcCX1bzArK7tBBQkzT6XJrwoij6NuV4cxbegTQ6WNbAAlx-m862lfzP9mcK_fM5fOvAaxePEnMMvqb8kQ4bgTmMKr2DqlS-2F4t6eiOPQx8vFZ-LURopOgAIC8akbbsfdnB1TJ9aaYdxqwG3BggR2mv1qEcp4dmdXKkn4tBeHnw 3.4 访问 https://NodeIp:30001 Dashboard提供了可以实现集群管理、工作负载、服务发现和负载均衡、存储、字典配置、日志视图等功能。
6、集群测试
1. 部署应用 1.1 命令方式 [root@k8s-master01 ~]# kubectl run httpd-app --image=httpd --replicas=2 通过命令行方式部署apache服务 1.2 配置文件方式 vim nginx.yml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-demo spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-demo spec: type: NodePort ports: - name: nginx nodePort: 30000 port: 80 protocol: TCP targetPort: 80 selector: app: nginx [root@k8s-master01 ~]# kubectl apply -f nginx.yml deployment.extensions/nginx created 通过配置文件方式部署nginx服务 2. 状态查看 2.1 查看节点状态 [root@k8s-master01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master01 Ready master 5h33m v1.17.3 node01 Ready <none> 5h32m v1.17.3 2.2 查看pod状态 [root@k8s-master01 ~]# kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE default nginx-demo-85ff79dd56-svdbl 1/1 Running 0 4h12m kube-system coredns-6955765f44-498gl 1/1 Running 2 5h33m kube-system coredns-6955765f44-5895j 1/1 Running 2 5h33m kube-system etcd-k8s-master01 1/1 Running 1 5h34m kube-system kube-apiserver-k8s-master01 1/1 Running 1 5h34m kube-system kube-controller-manager-k8s-master01 1/1 Running 1 5h34m kube-system kube-flannel-ds-amd64-f8f44 1/1 Running 0 4h55m kube-system kube-flannel-ds-amd64-krhxq 1/1 Running 0 4h55m kube-system kube-proxy-9gfqq 1/1 Running 1 5h33m kube-system kube-proxy-kzlpw 1/1 Running 0 5h33m kube-system kube-scheduler-k8s-master01 1/1 Running 1 5h34m kube-system kubernetes-dashboard-778ff9499c-ph44s 1/1 Running 0 5h21m 2.3 查看副本数 [root@k8s-master01 ~]# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nginx-demo 1/1 1 1 4h12m [root@k8s-master01 ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-demo-85ff79dd56-svdbl 1/1 Running 0 4h13m 10.244.1.8 node01 <none> <none> 可以看到nginx和httpd的3个副本pod均匀分布在3个节点上 2.4 查看deployment详细信息 [root@k8s-master01 ~]# kubectl describe deployments 2.5 查看集群基本组件状态 [root@k8s-master01 ~]# kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} 2.6 测试 [root@k8s-master01 ~]# curl 192.168.56.3:30000 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
浏览器访问如下:
7、 报错总结
1)、image.sh 脚本做一下补充
1>、url 已经做了修改,按照文中的 url 我下载的时候下载不了,超时,所以我已经改为可以下载的 url 了
2>、version 一定要改为自己的版本
2)、安装pod网络时 apply 的时候,那个文件一直超时,如果这样可以直接下载此文件即可
3)、如果 kubeadm init apply 的时候提示 xxx folder exist,执行如下的语句
kubeadm reset
4)、集群测试的时候 nginx.yaml 中如果apiVersion 写的是 extension/v1beta1 的话,会报错.改为如下的即可
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-demo spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-demo spec: type: NodePort ports: - name: nginx nodePort: 30000 port: 80 protocol: TCP targetPort: 80 selector: app: nginx