我正在将应用程序迁移到Docker / Kubernetes。此应用程序具有20多个知名端口,需要对其进行访问。需要从kubernetes集群外部访问它。为此,应用程序将其公共可访问的IP写入数据库,以便外部服务知道如何访问它。该IP来自向下的API(status.hostIP)。
一种解决方案是在服务中将众所周知的端口定义为(静态)nodePort,但是我不希望这样做,因为这会限制节点的可用性:如果另一个服务已启动并偶然占用了一个已知端口,则应用程序将无法启动。另外,由于Kubernetes在群集中所有节点上打开端口,所以每个群集只能运行1个应用程序实例。
现在,我想让应用程序知道由NodePort服务完成的端口映射。如何才能做到这一点?如我所见Service,Statefulset在Kubernetes中没有和之间的硬链接。
这是我的(简化的)Kubernetes配置:
apiVersion: v1
kind: Service
metadata:
name: my-app-svc
labels:
app: my-app
spec:
ports:
- port: 6000
targetPort: 6000
protocol: TCP
name: debug-port
- port: 6789
targetPort: 6789
protocol: TCP
name: traffic-port-1
selector:
app: my-app
type: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-app-sf
spec:
serviceName: my-app-svc
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-repo/myapp/my-app:latest
imagePullPolicy: Always
env:
- …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 CentOS7 中将 java 应用程序作为系统服务运行。该 jar 应该由特定用户运行:appuser。我有一个 shell 脚本,它使用以下命令运行 jar。整个脚本要大得多,因为它还处理停止、重新启动和状态,但这是开始部分:
servicename="myservice"
user="appuser"
pid_file="/var/run/$servicename.pid"
get_pid_from_file() {
cat "$pid_file"
}
get_pids() {
(ps -ef | grep myjar | grep $user | grep -v grep | awk '{print $2}')
}
is_running() {
! [ -z "`get_pids`" ] || ([ -f "$pid_file" ] && ps `get_pid_from_file` > /dev/null 2>&1)
}
case "$1" in
start)
if is_running; then
echo "Already started"
else
case "$2" in
*)
su -s /bin/sh $user -c "cd /app/myworkingdir ; java …Run Code Online (Sandbox Code Playgroud)