前言
最近因为工作需要,在调研kubernetes也就是K8s的环境搭建。查找了很多资料和视频,了解了K8s环境的搭建需要具备以下几个技能:
1、需要对Linux基础命令较熟悉;
2、需要对docker有一定的了解;
3、需要对计算机网络原理有一些了解;
4、需要了解kubernetes的原理、组件以及用途有较清楚的认识;
Kubernetes简单介绍
需要知道的大概的知识点,包括以下几个方面:
1、资源清单;
2、Pod控制器;
3、服务发现;
4、存储;
5、调度器;
6、安全;
7、HELM;
8、运维。
Kubernetes组件说明
需要知道如下几个组件到底是干什么用的:
1、api server;
2、Controller Manager;
3、Scheduler;
4、ETCD:键值对数据库,存储K8s集群所有重要信息;
5、kubelet:直接跟容器引擎交互,对容器生命周期进行管理;
6、kube-proxy:Iptables,Ipvs实现服务映射访问;
7、CoreDns:可为集群中的SVC创建一个域名Ip的对应关系解析;
8、Dashboard:B/S结构访问体系;
9、Ingress controller:官方支持四层代理,Ingress支持七层;
10、Fedetation;
11、Prometheus:K8s监控能力;
12、ELK:日志。
开始安装
以下是搭建一套一主二从集群环境所需要操作的重要脚本。
设置系统主机名以及host文件的相互解析
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02
安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
设置防火墙为iptables并设置空规则
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
关闭selinux
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
调整内核参数,对于k8s
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
vm.overcommit_memory=1
vm.panic_on_oom=0
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
关闭系统不需要的服务
systemctl stop postfix && systemctl disable postfix
设置rsyslogd 和systemd journald
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
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog=no
EOF
重启系统使用journald日志
systemctl restart systemd-journald
升级系统内核为4.44
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-lt
grub2-set-default 'CentOS Linux (4.4.223-1.el7.elrepo.x86_64) 7 (Core)'
kube-proxy 开启ipvs的前置条件
modprobe br_netfilter
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
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
安装docker软件
yum install -y yum-utils device-mapper-persistent-data lvm2
导入阿里云的镜像仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum update -y && yum install -y docker-ce
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts":["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts":{
"max-size":"100m"
}
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
systemctl start docker
systemctl enable docker
安装kubeadm 主从配置
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
systemctl enable kubelet.service
初始化主节点
kubeadm config print init-defaults > kubeadm-config.yaml
vi kubeadm-config.yaml
改ip
改kubernetes版本
添加
podSubnet: "10.244.0.0/16"
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
获取kube-flannel.yml 文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
建立本地hub仓库
在docker的daemon.json 中添加证书相关配置
“insecure-registries”:[“https://hub.yourdomain.com”]
在hosts中追加域名配置
echo “192.168.1.134 hub.yourdomain.com” >> /etc/hosts
Harbor 安装: Harbor 官方地址: https://github.com/vmware/harbor/releases
1 、解压软件包: tar xvf harbor-offline-installer-.tgz
https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.tgz
2 、配置 harbor.cfg
a 、必选参数
hostname :目标的主机名或者完全限定域名,yourdomain
ui_url_protocol : http 或 https 。默认为 http
db_password :用于 db_auth 的 MySQL 数据库的根密码。更改此密码进行任何生产用途
max_job_workers :(默认值为 3 )作业服务中的复制工作人员的最大数量。对于每个映像复制作业,
工作人员将存储库的所有标签同步到远程目标。增加此数字允许系统中更多的并发复制作业。但是,由于每个工
作人员都会消耗一定数量的网络 / CPU / IO 资源,请根据主机的硬件资源,仔细选择该属性的值
customize_crt :( on 或 off 。默认为 on )当此属性打开时, prepare 脚本将为注册表的令牌的生成 / 验证创
建私钥和根证书
ssl_cert : SSL 证书的路径,仅当协议设置为 https 时才应用
ssl_cert_key : SSL 密钥的路径,仅当协议设置为 https 时才应用
secretkey_path :用于在复制策略中加密或解密远程注册表的密码的密钥路径
3 、创建 https 证书以及配置相关目录权限
mkdir /data/cert
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
chmod -R 777 /data/cert
4 、运行脚本进行安装
./install.sh
5 、访问测试
https://reg.yourdomain.com 的管理员门户(将 reg.yourdomain.com 更改为您的主机名 harbor.cfg )。请注意,默认管理员用户名 / 密码为 admin / Harbor12345
安装helm
下载helm
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz
创建rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
执行文件
kubectl create -f rbac.yaml
初始化helm服务
helm init --service-account tiller --skip-refresh
查看pod详情
kubectl describe pod tiller-deploy-58565b5464-jjzqs -n kube-system
查看helm版本
helm version
安装dashboard
docker加载镜像
docker load -i dashboard.tar
查看helm仓库
helm repo list
helm增加stable的镜像源
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
更新helm仓库
helm repo update
helm获取dashboard
helm fetch stable/kubernetes-dashboard
新建kubernetes-dashboard.yaml文件
image:
repository: k8s.gcr.io/kubernetes-dashboard-amd64
tag: v1.10.1
ingress:
enabled: true
hosts:
- k8s.frognew.com
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
tls:
- secretName: frognew-com-tls-secret
hosts:
- k8s.frognew.com
rbac:
clusterAdminRole: true
通过helm安装dashboard
helm install . -n kubernetes-dashboard --namespace kube-system -f kubernetes-dashboard.yaml
删除名称空间为kube-system下的pod
kubectl delete pod kubernetes-dashboard-79599d7b8d-bnpp2 -n kube-system
编辑dashboard服务,type改为NodePort
kubectl edit svc kubernetes-dashboard -n kube-system
获取名称空间为kube-system下的pod信息
kubectl get pod -n kube-system -o wide
获取名称空间在kube-system下面的服务
kubectl get svc -n kube-system
查看token
kubectl -n kube-system get secret |grep kubernetes-dashboard-token
kubectl describe secret kubernetes-dashboard-token-llqjx -n kube-system
安装prometheus
在plugin目录下
mkdir prometheus
cd prometheus
git clone https://github.com/coreos/kube-prometheus.git
修改vi grafana-service.yaml
spec下一行添加type: NodePort
targetPort: web下一行添加nodePort: 30100
修改vi prometheus-service.yaml
spec下一行添加type: NodePort
targetPort: web下一行添加nodePort: 30200
修改vi alertmanager-service.yaml
spec下一行添加type: NodePort
targetPort: web下一行添加nodePort: 30300
导入镜像
查看所有命名空间下的pod信息
kubectl get pod -o wide --all-namespaces
说明:该文章为本人总结所得,如有雷同或者侵权请告知。