k8s 安装指南
#KubectlInstall*Kubectl是远程访问的K8s集群命令行工具*连接K8s集群的证书存放在~/.kube/config##安装kubectl###Linux```bashcurl-LOhttps://storage.googleapis.com/kubernetes-release/release/`curl-shttps://storage.googleapis.com/kube
·
Kubectl Install
- Kubectl 是远程访问的K8s集群命令行工具
- 连接K8s集群的证书存放在~/.kube/config
安装kubectl
Linux
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
Windows
- 安装 Chocolatey (Powershell 管理员运行)
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
- 安装 kubectl (Powershell 管理员运行)
choco install kubernetes-cli
- 安装完成后将config文件放在
~/.kube
目录下 如果目录~/.kube
不存在 自行创建
连接集群
- 执行
kubectl version
验证是否安装成功
参考
Install K8s Cluster in CentOS
相关环境
- CentOS 7.6
- K8s 1.16.2
- Docker 18.09.1
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
禁用swap
swapoff -a
- 修改
etc/fstab
- 在行首加 #,注释
/dev/mapper/centos-swap swap
安装Docker
- k8s支持的Docker版本
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io systemctl start docker.service systemctl enable docker.service
添加K8s Repo
cat>>/etc/yum.repos.d/kubrenetes.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
EOF
安装K8s
yum install -y kubeadm kubelet kubectl
设置k8s开机自启动
systemctl enable kubelet.service
K8s集群
创建集群需注意 如集群有多台机器 请修改每台机器的主机名使集群内各节点主机名不一致
创建K8s集群 Master Node
kubeadm init --image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=cri \
--kubernetes-version=1.16.2
- 输出以下信息表示,K8s与Docker版本不一致
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.4. Latest validated version: 18.09
- 输出以下信息表示,swap没有被禁用
[ERROR Swap]: running with swap on is not supported. Please disable swap
- 输出以下信息表示,请执行
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
- 安装成功后, 会显示如下的信息 按步执行即可
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
Init Network Flannel 初始化网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 由于某种不可抗力 请先下载yml至本机后执行
kubectl apply -f kube-flannel.yml
加入K8s集群 Slave Node
- 对于从节点 执行步骤至
安装K8s
无需init
- 在master节点上执行, 获取join-token
kubeadm token create --print-join-command
- 如
kubeadm join 192.168.69.128:6443 --token uc826o.l9na62a2ckmf5rjo --discovery-token-ca-cert-hash sha256:2be9656d7b4c3e9aab2b1259b0eea948f0b0b05d082267aa5676967cc495c168
- 从节点执行join-token
- 主机名称不能重复-如果重复即使work节点加入成功,master通过
kubectl get node
看不到work节点
K8s集群相关命令
- 集群获取节点
kubectl get nodes
- 集群删除节点
kubectl delete node <node-name>
- 被删除的节点重新加入集群 先执行
kubeadm reset
K8s UI kubernetes-dashboard
部署yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
- 此部署文档镜像来源于docker hub
- 假设部署文档由于众所周知的原因不可访问 请先通过技术手段获取文档后执行
部署命令
kubectl apply -f recommended.yaml
- 使用
NodePort
方式暴露30065端口 用于非k8s节点中访问 修改yaml以下内容 重新执行部署命令
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 30065 selector: k8s-app: kubernetes-dashboard
NodePort
方式默认端口范围30000-32767- 获取kubernetes-dashboard
访问token
kubectl -n kube-system describe $(kubectl -n kube-system get secret -o name | grep namespace) | grep token
- 在firefox中访问该网址
https://[k8s节点]:30065
如:master.k8s.zzhong.me:30065
选择token登录并输入访问token
- kubernetes-dashboard要求使用HTTPS Chrome不能访问此类没有认证的web 可以使用firefox访问
K8s Ingress
Ingress Controller (Nginx)
- 下载用于安装 Ingress Controller 的部署文件
mkdir -p ingress curl -s -o "ingress/#1.yaml" "https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/{configmap,mandatory,namespace,rbac,with-rbac}.yaml" curl -s -o "ingress/service.yaml" "https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml"
- 修改
ingress/service.yaml
- 注释
externalTrafficPolicy: Local
- 补充以下内容
externalIPs: - [master节点IP]
- 安装 Ingress Controller
kubectl create namespace ingress-nginx kubectl config set-context $(kubectl config current-context) --namespace "ingress-nginx" kubectl apply -f ./ingress kubectl rollout status deployments/nginx-ingress-controller
Ingress
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: workshop-ingress
labels:
app: workshop
annotations:
ingress.kubernetes.io/rewrite-target: /
generation: 1
spec:
rules:
- host: webshop.master.k8s.zzhong.me
http:
paths:
- path: /
backend:
serviceName: workshop-web
servicePort: 80
- 以上是一个Ingress Demo 表示webshop.master.k8s.zzhong.me域名直接访问的流量导入workshop-web服务的80端口 path是nginx的反向代理规则
- 注意: 在执行上述demo之前 已经将*.master.k8s.zzhong.me的域名解析至[master节点IP]
另一种ingress/service.yaml
方式
- 注释
externalTrafficPolicy: Local
- 不使用
externalIPs
使用NodePort
补充以下内容type: NodePort
- 重新部署
ingress/service.yaml
通过kubectl get svc | grep ingress-nginx
获取ingress-nginx
服务的外部端口, 如32375 - 直接访问
webshop.master.k8s.zzhong.me:32375
即可
Ingress Https
- Dashboard需要HTTPS访问 以下是将Dashboard添加HTTPS访问的过程
- 申请阿里云的免费的ssl证数并绑定
dashboard.k8s.cxist.cloud
域名 申请过程自行百度 - 下载nginx对应的证数 包括
***.key
和***pem
- 执行以下的命令先获取
***.crt
并创建tls类型secretkubernetes-dashboard-tls
openssl x509 -in dashboard.pem -out dashboard.crt kubectl create secret tls kubernetes-dashboard-tls --cert=dashboard.crt --key=dashboard.key -n kubernetes-dashboard
- 创建kubernetes-dashboard-ingress.yaml
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: kubernetes-dashboard-ingress namespace: kubernetes-dashboard annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" spec: tls: - hosts: - dashboard.k8s.cxist.cloud secretName: kubernetes-dashboard-tls rules: - host: dashboard.k8s.cxist.cloud http: paths: - path: / backend: serviceName: kubernetes-dashboard servicePort: 443
- 执行
kubectl apply -f kubernetes-dashboard-ingress.yaml
User Config
- k8s安装后 默认admin的kubeconfig在路径
/etc/kubernetes/admin.conf
- k8s集群有ServiceAccount和User两类用户 区别在于ServiceAccount用于程序访问的 User用于人访问的 详情参考
- 以下是创建user并创建其对应的kubeconfig的sh脚本 使用方法:
sh createuser.sh --user-name redz
- 注意 此脚本会创建用于dashboard访问的token 此token是根据
namespace-controller-token-***
创建的 此功能允许使用此脚本生成的config访问本集群的dashboard - 注意 此脚本创建的用户绑定cluster-admin角色 如需增加或减少角色绑定请修改此sh脚本最后
添加 clusterrolebinding
部分# 变量 # 变量 # k8s集群地址 KUBE_URL=https://192.168.69.128:6443 # k8s集群名称 CLUSTER=xcloud # 授权时间 CRT_DAYS=365 # 用户名 USER_NAME=no_name # 用户组 USER_GROUP_NAME=TMSDEV # 默认命名空间 DEFAULT_NAMESPACE=tms-dev while [[ $# -gt 0 ]] do key="$1" case $key in --user-name) USER_NAME="$2" shift shift ;; *) shift ;; esac done echo $USER_NAME # 在当前目录下添加目录,用来存放证书 mkdir -p certs/$USER_NAME # CA 证书可以在 master node 上找到 # 一般就在 /etc/kubernetes/ssl 或者 /etc/kubernetes/pki 里面 CA_CRT_PATH=/etc/kubernetes/pki/ca.crt CA_KEY_PATH=/etc/kubernetes/pki/ca.key # 生成私有密钥 openssl genrsa -out certs/$USER_NAME/$USER_NAME.key 2048 # 用私钥生成证书,CN 表示用户名,O 表示用户组 openssl req -new -key certs/$USER_NAME/$USER_NAME.key -out certs/$USER_NAME/$USER_NAME.csr \ -subj "/CN=$USER_NAME/O=$USER_GROUP_NAME" # 然后用 CA 证书来给刚才生成的证书来签名 # 在这个例子中,我们给 xizhibei 这个账户签发了一张有效期为一年的证书 openssl x509 -req -in certs/$USER_NAME/$USER_NAME.csr -CA $CA_CRT_PATH -CAkey $CA_KEY_PATH \ -CAcreateserial -out certs/$USER_NAME/$USER_NAME.crt -days $CRT_DAYS # 存放 kubectl config 的文件 KUBECONFIG=$USER_NAME.conf # 设置 cluster kubectl config set-cluster $CLUSTER --server="$KUBE_URL" \ --certificate-authority="$CA_CRT_PATH" --embed-certs=true --kubeconfig=$KUBECONFIG # 设置私钥以及已签名证书 kubectl config set-credentials $USER_NAME --client-certificate=certs/$USER_NAME/$USER_NAME.crt \ --client-key=certs/$USER_NAME/$USER_NAME.key --embed-certs=true --kubeconfig=$KUBECONFIG # 设置 context kubectl config set-context $USER_NAME-context --cluster=$CLUSTER --user=$USER_NAME --namespace=$DEFAULT_NAMESPACE --kubeconfig=$KUBECONFIG kubectl config use-context $USER_NAME-context --kubeconfig=$KUBECONFIG # 根据 namespace-controller-token-*** 生成 dashboard token SECRET_NAME=$(kubectl get secret -n kube-system -o go-template --template='{{range.items}}{{printf "%s\n" .metadata.name}}{{end}}' | grep namespace-controller-token) DASH_TOCKEN=$(kubectl get secret -n kube-system $SECRET_NAME -o jsonpath={.data.token}|base64 -d) # 设置 dashboard token kubectl config set-credentials $USER_NAME --token=$DASH_TOCKEN --kubeconfig=$KUBECONFIG # 添加 clusterrolebinding # 添加角色绑定到cluster-admin 添加角色具体参考k8s RBAC kubectl create clusterrolebinding $USER_NAME-cluster-admin --clusterrole cluster-admin --user $USER_NAME -n kube-system
参考
- k8s官方文档
- k8s部署@jessetalk
- kubernetes-dashboard部署
- k8s官方中文文档 (内容覆盖不全面)
- ingress-nginx
- kubernetes https (非常详细)
- k8s 创建User Config
K8s Helm
相关环境
- CentOS 7.6
- K8s 1.16.2
Helm说明
- 快速部署k8s资源的工具或者方式
- 分成客户端和服务端
安装Helm
安装 Helm Client(Linux)
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
helm init --client-only
安装 Helm Client(Windows)
- 管理员执行
choco install kubernetes-helm helm init --client-only
安装 Helm 服务器端 Tiller
helm init
- 由于某种不可抗力 上述命令可能会执行失败 请执行以下命令 初始化Helm
helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
- 输出以下信息表示,第一次Init Helm的版本是v2.16.1 第二次Init Helm的版本是v2.9.1
Error: error when upgrading: current Tiller version gcr.io/kubernetes-helm/tiller:v2.16.1 is newer than client version registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1, use --force-upgrade to downgrade
- 重新初始化Helm
helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
Tiller 授权
- 创建 Kubernetes 的服务帐号和绑定角色
kubectl create serviceaccount --namespace kube-system tiller kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
- 为 Tiller 设置帐号
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
- 查看是否授权成功
kubectl get deploy --namespace kube-system tiller-deploy --output yaml|grep serviceAccount
- 验证 Tiller 是否安装成功 详细参考Helm 入门指南
Helm使用
Helm add repo 添加Helm仓库
- 安装 Helm Client
- 执行
helm repo list
- 添加Helm repo
helm repo add --username=*** --password==*** --ca-file [crt文件] [仓库名] [仓库地址]
helm repo list
查询helm仓库- 仓库地址是HTTPS 需要crt文件
问题记录
- 前提 使用
root
账号安装Helm Client 使用user
账号Helm add repo
helm repo add --username=*** --password==*** --ca-file hub.iubang.com.crt xcloud https://hub.iubang.com:5000/chartrepo/xcloud
- 执行上述命令返回
Error: open /home/user/.helm/repository/repositories.yaml: permission denied
sudo helm repo add --username=*** --password==*** --ca-file hub.iubang.com.crt xcloud https://hub.iubang.com:5000/chartrepo/xcloud
- 执行上述命令返回
sudo: helm: command not found
- 分别执行
printenv PATH
和sudo printenv PATH
发现使用sudo
和不使用sudo
会导致不同的PATH - helm默认安装在/usr/local/bin下 正好不在
sudo printenv PATH
Path中 所以sudo helm ...
返回sudo: helm: command not found
- 因为需要修改
/home/user/.helm/repository/repositories.yaml
文件 必须有sudo
所以执行以下命令sudo /usr/local/bin/helm repo add --username=*** --password==*** --ca-file hub.iubang.com.crt xcloud https://hub.iubang.com:5000/chartrepo/xcloud
- 执行上述命令返回返回
Error: Couldn't load repositories file (/root/.helm/repository/repositories.yaml).
- 重新指定
.helm
路径 - 具体参考sudo提示command not found的问题
sudo /usr/local/bin/helm repo add --username=*** --password=*** --ca-file hub.iubang.com.crt --home /home/user/.helm xcloud https://hub.iubang.com:5000/chartrepo/xcloud
- 执行上述命令成功
Install Helm push 插件
- Install Helm push 插件需要
git
- 安装git命令
yum install git
helm plugin install https://github.com/chartmuseum/helm-push
Helm 使用
helm repo update xcloud
更新远程仓库的内容到本地仓库helm install xcloud/tms-services --name tms-services-dev
使用xcloud/tms-services
最新版本部署应用 应用名为tms-services-dev
helm upgrade tms-services-dev xcloud/tms-services
使用xcloud/tms-services最新版本升级应用
tms-services-dev`
参考
更多推荐
已为社区贡献2条内容
所有评论(0)