k8s1.17.2+centos7.7+docker18.06
Master节点:API Server(kube-apiserver):提供了HTTP Rest接口的关键服务进程,是kubernetes里所有资源的增删改查等操作的唯一入口,也是集群中的入口进程Controller Manager(kube-controller-manager):kubernetes里所有资源对象的自动化控制中心,可以理解成为资源对象的“大总管”Scheduler:(kube-
1.简介
1.1pod网络
总述:Kubernetes 的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中
- Flannel:基于L2,构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。
- Calico:纯L3,构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。
1.2组件简介
- Master节点:
- API Server(kube-apiserver):提供了HTTP Rest接口的关键服务进程,是kubernetes里所有资源的增删改查等操作的唯一入口,也是集群中的入口进程
- Controller Manager(kube-controller-manager):kubernetes里所有资源对象的自动化控制中心,可以理解成为资源对象的“大总管”
- Scheduler:(kube-scheduler):负责资源调度(pod调度)的进程,相当于公交公司的“调度室”
- Etcd:所有资源对象的数据被会被保存到etcd中,持久化
- Node节点:
- docker engine:docker引擎,负责本主机的容器创建 和管理工作
- kubelet:负责pod对应容器的创建,启停等任务,另外kubelet与master紧密协作,随时报告给master自身的情况,如CPU,内存,操作系统,docker版本等
- kube-proxy:实现kubernetes server的通信与负载均衡机制的重要组件;提供svc服务(服务发现);负责写入规则至 IPTABLES(ip数据包过滤)、IPVS(负载均衡) 实现服务映射访问的;
- k8s其它组件:
- kubectl:命令行工具
- DASHBOARD:网页面板;给 K8S 集群提供一个 B/S 结构访问体系
1.3k8s
- pod控制器:Deployment 》ReplicaSet 》pod
- kubectl run 并不是直接创建一个 Pod,而是先创建一个 Deployment 资源(replicas=1),再由与 Deployment 关联的 ReplicaSet 来自动创建 Pod
- CNI(flannel或Calico)将为pod构建网络。
- 为pod创建svc 可以获取cluster_ip
2.环境
- linux
- 5.6.5-1.el7.elrepo.x86_64
- CentOS Linux release 7.7.1908 (Core)
- docker
- Docker version :docker-ce-18.06.0.ce-3.el7
- docker-compose
- docker-compose version 1.25.4
- k8s:版本 1.17.2
- kube-controller-manager:1.17.2
- kube-scheduler:1.17.2
- kube-apiserver:1.17.2
- kubectl:1.17.2
- kube-proxy:1.17.2
- etcd:3.4.3-0
- pause:3.1
- coredns:1.6.5
3.安装k8s1.17.2
3.1系统准备
主要配置:
-
设置主机名:
#master01 hostnamectl set-hostname k8s-master01 #node01 hostnamectl set-hostname k8s-node01 #node02 hostnamectl set-hostname k8s-node02
-
host文件 ip解析
master01 hosts文件需要写入node节点;node节点只需要写入自己和master01节点
#master01 vi /etc/hosts 192.168.2.94 k8s-master01 192.168.2.93 k8s-node01 192.168.2.92 k8s-node02 #node01 vi /etc/hosts 192.168.2.94 k8s-master01 192.168.2.93 k8s-node01 #node02 vi /etc/hosts 192.168.2.94 k8s-master01 192.168.2.92 k8s-node02
-
master01节点上配置免密登录node节点
#生成ssh ssh-keygen #拷贝生成的公钥到其它节点 ssh-copy-id -i root@k8s-node01 ssh-copy-id -i root@k8s-node02
-
yum安装依赖包:
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
-
设置防火墙为 Iptables 并设置空规则:kubeproxy操作iptables
#停止、禁用默认防火墙firewalld systemctl stop firewalld && systemctl disable firewalld #安装设置iptables防火墙 yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
-
关闭swap分区:pod运行在swap分区中会大大影响效率
- 临时关闭:
- 永久关闭:
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
-
禁用SELINUX:开启会限制服务进程访问资源
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
-
配置内核参数:将桥接的IPv4流量传递到iptables过滤链
cat > kubernetes.conf <<EOF 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 vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它 vm.overcommit_memory=1 # 不检查物理内存是否够用 vm.panic_on_oom=0 # 关闭 OOM fs.inotify.max_user_instances=8192 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 EOF cp kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf
-
日志处理:采用 systemd journald日志记录方式而不是rsyslogd方式
mkdir /var/log/journal # 持久化保存日志的目录 mkdir /etc/systemd/journald.conf.d cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF [Journal] # 持久化保存到磁盘 Storage=persistent # 压缩历史日志 Compress=yes SyncIntervalSec=5m RateLimitInterval=30s RateLimitBurst=1000 # 最大占用空间 10G SystemMaxUse=10G # 单日志文件最大 200M SystemMaxFileSize=200M # 日志保存时间 2 周 MaxRetentionSec=2week # 不将日志转发到 syslog ForwardToSyslog=no EOF systemctl restart systemd-journald
-
开启IPVS(负载均衡):
cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe br_netfilter modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF #操作上面创建的文件 chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
其它配置:可配置可不配置
-
关闭系统不需要的服务:
#postfix邮件服务 systemctl stop postfix && systemctl disable postfix
-
调整系统时区
# 设置系统时区为 中国/上海 timedatectl set-timezone Asia/Shanghai # 将当前的 UTC 时间写入硬件时钟 timedatectl set-local-rtc 0 # 重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond
3.2安装配置docker
-
删除旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
-
安装工具
yum install -y yum-utils device-mapper-persistent-data lvm2
-
设置python版本
#将第一行python换为python2.7 vi /usr/bin/yum-config-manager
-
添加yum信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum缓存
yum makecache fast
-
查看可用的docker版本
yum list docker-ce --showduplicates | sort -r
-
安装docker-ce
yum -y install docker-ce-18.06.0.ce-3.el7
-
启动设置开启自启
systemctl start docker && systemctl enable docker
-
设置阿里镜像源
#注意,先运行一次docker 才会有这个文件夹 vi /etc/docker/daemon.json #加入以下内容;insecure-registries 设置不安全的镜像仓库,自己的harbor仓库;exec-opts k8s需要docker以systemd的模式运行 { "registry-mirrors": [ "http://docker.mirrors.ustc.edu.cn", "https://自己在阿里云去配置.com", "http://hub-mirror.c.163.com", "http://registry.docker-cn.com" ], "insecure-registries": [ "192.168.2.60:9999" ], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": {"max-size": "100m"} }
-
创建systemd所需目录
mkdir -p /etc/systemd/system/docker.service.d
-
重启docker并设置开机自启
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
3.3安装docker-compose
-
从github上下载docker-compose二进制文件
curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
-
将下载的文件放置在/usr/local/bin/
-
将下载文件赋予可执行权限
chmod +x /usr/local/bin/docker-compose
-
测试
docker-compose --version
3.4安装k8s kubectl、kubelet、kubeadm
-
配置kubernetes的阿里云yun源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes repo baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg enabled=1 EOF
-
安装
yum install -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2
-
启动kubelet服务
systemctl enable kubelet && systemctl start kubelet
3.5初始化k8s集群
在master01节点执行初始化
-
输出初始化默认配置到文件kubeadm-config.yaml
kubeadm config print init-defaults > kubeadm-config.yaml
增加:podSubnet;修改kubernetesVersion;修改advertiseAddress(masterIP);修改imageRepository为阿里云
apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.2.94 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: k8s-master01 taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.17.2 networking: dnsDomain: cluster.local podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 scheduler: {}
-
执行初始化命令将命令结果记录到kubeadm-init.log中
kubeadm init --config=kubeadm-config.yaml --v=6 --upload-certs | tee kubeadm-init.log
如果报错,有镜像未被拉取下来,重新执行一次;或者直接从阿里云拉取镜像
示例:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.2.24
-
讲解kubeadm-init.log
kubelet环境变量:/var/lib/kubelet/kubeadm-flags.env
kubelet配置信息:/var/lib/kubelet/config.yaml
k8s所有的证书:/etc/kubernates/pki ;采用https的证书安全策略;ca厂商;私钥;crt证书
k8s所有的配置文件:/etc/kubernates ;controller-manager.conf;scheduler.conf等配置文件都在这个目录下
$HOME/.kube作用:kubectl与apiserver以http协议进行交互,产生的缓存存储在这里;config认证文件也会保存在这个目录下。 -
根据kubeadm-init.log 提示操作:查看自己的kubeadm-init.log操作
在master节点执行
#创建交互缓存目录 .kube mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u): (id−u):(id -g) $HOME/.kube/config
在node节点执行:将当前节点加入k8s
```shell
kubeadm join 192.168.2.94:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:64a70d3945cf0ef0ace4f9e793d494de274f5a43c05020a80b5c1c915974e22a
3.7配置CNI网络
暂时使用Flannel(基于L2)构建扁平化的网络;以后升级到Calico(完全基于L3)
在master01节点执行操作
-
创建flannel目录
mkdir install-k8s/plugin/flannel cd install-k8s/plugin/flannel
-
创建yaml文件
#访问 https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 复制其中的内容到kube-flannel.yml文件中 vi kube-flannel.yml
-
执行yaml文件创建扁平化网络
kubectl apply -f kube-flannel.yml
-
测试
#所有节点STATUS 为Ready 构建成功 kubectl get node #查看网络,多了一个flannel.1的网络 ifconfig
3.8保存重要文件
mkdir install-k8s/core
mv kubeadm-init.log kubeadm-config.yaml install-k8s/core
mv install-k8s/ /usr/local
3.9安装配置harbor
。。。最好配置域名;配置假的CA证书,否则kubectl run nginx-deployment --image=192.168.2.60:9999/k8s/myapp:v1 --port=80 --replicas=1 命令无法成功执行;因为无法区分:9999 和 myapp:v1
详细见 Harbor - 企业级 Docker 私有仓库.pdf
一些命令:
#打标签 原来的标签为 repository:tag
docker tag wangyanglinux/myapp:v1 192.168.2.60:9999/k8s/myapp:v1
#登录
docker login 192.168.2.60:9999
#上传 harbor地址/项目/仓库/镜像
docker push 192.168.2.60:9999/k8s/myapp:v1
3.10pod测试
-
拉取镜像
docker pull wangyanglinux/myapp:v1
-
生成deployment
–image=指定的镜像是本地镜像名称:tag
kubectl run nginx2-deployment --image=wangyanglinux/myapp:v1 --port=80 --replicas=1
-
查看发布,REDY 1/1才表示成功
kubectl get deployment
-
测试根据套接字访问某个pod
#获取pod详细信息;里面有构成的pod的网络ip kubectl get pod -o wide #已经构成了扁平化的网络,直接通过私有ip是可以访问的pod的;根据上面的kubectl run port=80 curl ip:port #获取某个pod的hostname curl ip:port/hostname.html
-
pod控制器控制副本数目
删除pod,查看pod仍然存在
#删除pod kubectl delete pod NAME #查看pod信息,发现还是有这个pod,NAME有所不同;因为,kubectl run --replicas=1 指定了需要维持的副本数目 kubectl get pod
-
水平扩展
#水平扩展 deployment/名字 在kubectl run 指定的名字 kubectl scale --replicas=3 deployment/nginx-deployment #查看pod kubectl get pod -o wide
3.11开启kubeproxy负载均衡
注意,需要首先在虚拟机上开启ipvs,kubeproxy的负载均衡是基于ipvs的
-
修改ConfigMap的kube-system/kube-proxy中的config.conf,把 mode: “” 改为mode: “ipvs" 保存退出即可
kubectl edit cm kube-proxy -n kube-system
-
删除之前的kube-proxy pod
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
-
查看proxy运行状态
kubectl get pod -n kube-system | grep kube-proxy
-
查看日志,如果有Using ipvs Proxier 说明kube-proxy的ipvs 开启成功
#kube-proxy-54qnw为上面一条命令执行结果podName kubectl logs kube-proxy-54qnw -n kube-system
-
测试负载均衡
#负载多个pod,一般方案通过nginx去负载;现在使用svc #target-port是内部端口,deployment_NAME就是run pod时使用到的deploymentname kubectl expose deployment deployment_NAME --port=30000 --target-port=80 #查看svc,获取cluster_ip kubectl get svc #根据 Cluster-ip访问 curl cluster-ip:port #测试,发现发现pod_name在变化 因为是轮询的机制(ipvs提供的负载均衡轮询机制) curl cluster-ip/hostname.html
-
ipvsadm管理ipvs
#使用ipvs管理工具 ipvsadm 查看某个ip负载机制 ipvsadm -Ln | grep clusterIP #看完全 ipvsadm -Ln
3.12外网访问
#编辑svc;将type: ClusterIP改为type: NodePort
kubectl edit svc svcName
#再次查看svc,发现给了一个端口 例如,30000:31859 (由内而外);作用,所有的节点都暴露这个可以访问的端口;查看type是否为NodePort
kubectl get svc
#浏览器访问这个端口;使用 主节点ip:31859 可以访问;使用 起他节点ip:31859 也可以访问
4.kubectl命令
#获取所有节点
kube get node
#检查组件的健康状态;componentstatus可简写为cs
kubectl get componentstatus
#查看deployment;控制器deployment会使用RS创建pod
kubectl get deployment
#查看ReplicaSet
kubectl get rs
#获取pod状态 -n --name 名空间
kubectl get pod -n kube-system
#查看pod更详细的信息,node节点在init过程中;-o option
kubectl get pod -n kube-system -o wide
#替代命令,持续监视 -w watch
kubectl get pod -n kube-system -w
#删除pod
kubectl delete pod podName
#删除RS
kubectl delete rs rsName
#删除deployment
kubectl delete deployment deploymentName
#删除svc
kubectl delete svc svcname
#查看pod日志
kubectl -n kube-system logs -f <pod name>
#应用资源清单
kubectl apply -f pod.yml
5.安装Dashboard
5.1默认用户和管理员登录
在master01节点下执行:
-
/usr/local/install-k8s/plugin/dashboard/目录下创建recommend.yaml ;访问官网将内容拷贝
vi recommend.yaml
-
修改recommend.yaml
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: ports: - port: 443 targetPort: 8443 selector: k8s-app: kubernetes-dashboard
修改为
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: type: NodePort #新增 ports: - port: 443 nodePort: 30001 #新增 targetPort: 8443 selector: k8s-app: kubernetes-dashboard
spec: containers: - name: kubernetes-dashboard image: kubernetesui/dashboard:v2.0.0-beta8 imagePullPolicy: Always ports: - containerPort: 8443 protocol: TCP
修改为
spec: # nodeName: master.node 指定到master节点,指不指定根据需要 containers: - name: kubernetes-dashboard image: kubernetesui/dashboard:v2.0.0-beta8 # imagePullPolicy: Always imagePullPolicy: IfNotPresent #镜像下载策略 不存在再下载 ports: - containerPort: 8443 protocol: TCP
-
下载Dashboard镜像
docker pull kubernetesui/dashboard:v2.0.0-beta8
-
应用recommend.yaml
kubectl apply -f recommended.yaml
-
查看svc状态,与dashboard有关的pod都必须Ready 1/1
kubectl get pods,svc -n kubernetes-dashboard -o wide
-
浏览器访问:注意使用https
https://192.168.2.94:30443/
-
默认用户:点击token,使用token方式登录
默认用户kubernetes-dashboard 登录;很多数据访问不了。
#获取用户名密码 kubectl get sa,secrets -n kubernetes-dashboard #获取token,kubernetes-dashboard-token-ls8l4 后面几位有所不同 kubectl describe secrets kubernetes-dashboard-token-ls8l4 -n kubernetes-dashboard
复制token 填写到浏览器上。
-
新增管理员用户:点击token,使用token方式登录
/usr/local/install-k8s/plugin/dashboard/目录下创建create-admin.yaml
填入一下内容:
apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard
应用:
kubectl apply -f create-admin.yaml
查看与dashboard有关pod是否ready 1/1
kubectl get sa,secrets -n kubernetes-dashboard
管理员账户登录能访问所有数据:
#获取用户名密码 kubectl get sa,secrets -n kubernetes-dashboard #获取token,admin-user-token-ls8l4 后面几位有所不同 kubectl describe secrets admin-user-token-ls8l4 -n kubernetes-dashboard
将token复制到浏览器,发现可以访问所有数据
5.2问题解决
-
如果发现创建的dashboard有错,需要先删除错误的。
kubectl delete -f recommended.yaml
6.Ingress安装
6.1简介
ingress可以实现7层网络协议即应用层https层;内部原理可以理解为使用nginx进行反向代理
6.2安装
-
选择模式:Bare-metal
Bare-metal deploy.yaml
提前pull mandatory.yaml文件中所需镜像
#获取yaml文件中所需镜像名 cat mandatory.yaml | grep image #在master和node节点中pull镜像 docker pull 镜像
应用deploy.yaml文件
kubectl apply -f deploy.yaml
-
测试
#查看名称空间ingress-nginx,有没有叫ingress-controller***的svc kubectl get svc -n ingress-nginx #查看名称空间ingress-nginx,有没有叫ingress-controller***的pod kubectl get pod -n ingress-nginx
10.问题解决
-
No more mirrors to try:
yum makecache
11.参考网址
更多推荐
所有评论(0)